【问题标题】:How to declare array string in c++如何在 C++ 中声明数组字符串
【发布时间】:2010-10-13 18:22:58
【问题描述】:

这是非常基本的,但是:

我想要一个有 4 个字符的字符串:“abcd”

我必须如何声明一个新字符串,像这样?

char *newStr = new char[4]; // or -> char newStr[4];

strcpy(newStr, "abcd");

null '\0' 字符必须在字符串的大小上,所以 new char[5]?

【问题讨论】:

  • new 不是 C 关键字。也许您打算将此问题标记为c++?
  • 你说得对,我改标题
  • 使用std::string。不要手动操作。

标签: c++ arrays char


【解决方案1】:

是的,\0 字符是字符串的一部分,您也必须为其分配内存

【讨论】:

    【解决方案2】:

    是的,终止 nul 字符是字符串的一部分。所以你需要为5字符分配空间:

    char *newStr = new char[5];
    strcpy(newStr, "abcd");
    

    使用完后不要忘记释放动态分配的内存:

    delete[] newStr;
    

    或者你也可以这样做:

    char newStr[] = "abcd";
    

    在 C++ 中,最好使用 string class 来表示字符串:

    string newStr = "abcd";
    

    【讨论】:

      【解决方案3】:

      C 中没有“新”,而只有 C++。

      你可以:

      char* string = "abc";
      

      或

      char string[] = "abc";
      

      或

      char* string = (char*) malloc(sizeof(char) * 4);
      strcpy(string, "abc");
      string[3]='\0';
      /* remember to free the used memory */
      

      或

      char string[] = { 'a', 'b', 'c', '\0' };
      

      【讨论】:

      • (char*) 不需要强制转换,sizeof(char) 始终为 1,不需要 string[3]='\0',strcpy 可以这样做
      • 需要强制转换,sizeof(char) 可能不是 1,strcpy 不复制终止字符。编辑:编译器不需要演员表,为了清楚起见,我建议保留它。
      • @vulkanino:正确(在 C++ 中但不是 C),错误(在两者中),错误(在两者中)。
      • 在 C 中,来自malloc 的强制转换是不必要的,sizeof(char) 按照 C 标准中的定义始终为 1,strcpy 确实复制了 \0 字节。
      • @vulkanino:从 C89 开始,在 C 中不需要强制转换,不鼓励使用。在 C++ 中是必需的,但您不应该在 C++ 代码中使用 malloc()。而strcpy() 会将终止的0 写入目标字符串。
      【解决方案4】:

      这应该为您完成肮脏的工作:

      char newString[] = "abcd";
      

      另外,是的,你需要 new char[5];

      【讨论】:

        【解决方案5】:

        如果这是 C++(似乎为我读过的内容重新标记),有什么问题

        std::string my_string = "abcd"; 
        

        ?

        这不是你要找的吗?我可能会遗漏一些东西。

        【讨论】:

          【解决方案6】:

          / -------------------------------- 字符串构造函数----------------

          string emp("");              // constructs the "empty string"
          string emp2;                 // constructs another "empty string"
          string spc(" ");             // constructs string containing " "
          string sstr("Some string");  // string containing "Some string"
          char frob[] = "Frobnitz";
          string sfrob(frob);          // constructs a C++ string containing
                                       //   "Frobnitz" from a C-style string
          string bar = "foobar";       // string containing "foobar"
          
          // ------------------- stdout, c_str() --------------------
          

          来源:http://www-cs-students.stanford.edu/~sjac/c-to-cpp-info/string-class

          【讨论】:

          • 不,这是字符串类,仅在 C++ 的标准库中可用
          【解决方案7】:

          如果是字符串字面量,您可以执行以下任一操作:

          char *string = "abcd";
          char astring[] = "abcd";
          

          如果你想知道这一点以便最终复制字符串,你可以有一个缓冲区,或者分配内存,'\0' 的空间是必要的,即使strlen("abcd") 将返回 4,因为它不计算终止符.

          /* buffer way */
          char string[5];
          strcpy(string, "abcd");
          
          /* allocating memory */
          // char *ptr = malloc(5*sizeof(*ptr)); // question was retagged C++
          char *ptr = static_cast<char*>(malloc(5*sizeof(*ptr));
          strcpy(ptr,"abcd");
          /* more stuff */
          free(ptr);
          

          由于问题已重新标记为 C++,您也可以使用new 和delete。

          /* using C++ new and delete */
          char *ptr = new char[5]; // allocate a block of 5 * sizeof(char)
          strcpy(ptr, "abcd");
          // do stuff
          delete [] ptr; // delete [] is necessary because new[] was used
          

          或者你也可以使用std::string。

          【讨论】:

          • 应该指出,您的前两个建议似乎暗示该语言是 C - 但我认为 C 没有 static_cast 或模板。 :) 如果你这样做了,那么你使用的是 C++,因此,你可以避免使用 malloc 来进行良好的衡量。 :)
          • 原来的问题被标记为'C',所以我最初用malloc编写了C代码。它后来被重新标记为 C++,所以我将原来的 malloc 示例更改为返回 void*。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-07
          • 1970-01-01
          • 2013-05-25
          • 1970-01-01
          • 2012-10-22
          • 2014-01-14
          相关资源
          最近更新 更多