1

我写了以下代码:

char *pch=new char[12];
char *f=new char[42];
char *lab=new char[20];
char *mne=new char[10];
char *add=new char[10]; 

如果最初我希望这些数组为空,我不能这样做:

*lab="\0";
*mne="\0";
and so on.....

之后,如果我想将一些 cstring 添加到一个空数组中,我不能检查:

 if(strcmp(lab,"\0")==0)
 //then add cstring by *lab="cstring";

如果我不能做任何这些事情,请告诉我正确的方法......

4

3 回答 3

3

在 C++11 中,初始化数组的一种简单方法是使用大括号初始化器:

char * p = new char[100] { 0 };

这里的原因是所有缺少的数组元素都将被初始化为零。您还可以使用显式值初始化(我认为这在 C++98/03 中甚至是允许的),这是原始类型的零初始化:

char * q = new char[110]();
于 2011-09-19T21:59:17.777 回答
1

First of all, as DeadMG says, the correct way of doing this is using std:string:

std::string lab; // empty initially, no further initialization needed

if (lab.size() == 0) // string empty, note, very fast, no character comparison
    lab += "cstring"; // or even lab = "cstring", as lab is empty

Also, in your code, if you insist in using C strings, after the initialization, the correct checking for the empty string would be

if (*lab == '\0')
于 2011-09-19T22:03:05.967 回答
0

首先,我同意其他人std::string在绝大多数情况下使用 a 而不是字符数组。帮助链接在这里:C++ 字符串库

现在也直接回答您的问题:

*lab="\0";
*mne="\0";
and so on.....

这是错误的。假设您的编译器没有给您错误,您没有将“空终止符”分配给这些数组,而是尝试将"\0"字符串所在位置的指针值分配给 char* 所在的前几个内存位置指向!请记住,您的变量是指针,而不是字符串。如果您试图在开头放置一个空字符,以便strlen或其他 C 字符串函数看到一个“空”字符串,请执行以下操作:*lab='\0'; 不同之处在于,单引号表示字符\0,而双引号,它是一个字符串文字,它返回一个指向第一个元素的指针。我希望这是有道理的。

现在对于您的第二个,您不能只是像那样“分配”给 C 风格的字符串。您需要将每个字符放入数组并正确终止它。通常最简单的方法是sprintf

sprintf(lab, "%s", "mystring");

这可能没有多大意义,特别是因为我没有取消引用指针,但我会引导你完成它。第一个参数对 sprintf 说“将你的字符输出到这个指针指向的地方”。所以它需要原始指针。第二个是格式字符串,如printf使用。所以我告诉它使用第一个参数作为字符串。第三个是我想要的,一个指向另一个字符串的指针。这个例子也适用sprintf(lab, "mystring")

如果您想了解 C 风格的字符串处理,您需要阅读一些示例。恐怕我什至不知道在网上哪里可以找到这方面的好例子,但我祝你好运。我强烈建议您查看 C++ 字符串库以及basic_string<>那里的类型。这就是你应该使用的 std::string 的类型定义。

于 2012-06-01T16:14:59.787 回答