2

我有一些执行以下操作的代码:

while(some condition)
{
     char *line[WORDLEN];
     //do stuff to line, including strcat(line, "words")
     printf("%s", line);
     line[0] = '\0';
}

但是,似乎 line[0] = '\0' 并没有像我希望的那样做。我想返回循环,并使用 line ,就好像它刚刚被声明一样。该循环第一次按预期工作,但是在后续迭代中无法将 line 视为新的 char*[] 。知道为什么吗?

4

3 回答 3

6
char *line[WORDLEN];

是一个字符指针数组。我认为你的意思是:

char line[WORDLEN];

单个字符数组。我只会选择:

while(some condition)
{
     char line[WORDLEN];
     line[0] = '\0';
     //do stuff to line, including strcat(line, "words")
     printf("%s", line);
}

因为这保证了字符串在每次通过循环之前都是空的,然后再开始对它进行任何操作,并且与范围规则无关。

于 2010-09-16T03:52:52.177 回答
4

在您的代码中,您不需要一个字符指针数组 - 您需要一个字符数组:

while (some condition)
{
     char line[WORDLEN];

现在,每次通过循环,变量 line 都有不确定的内容 - 理论上。特别是在第一次通过时,它没有明确的价值。所以,你应该初始化它:

     char line[WORDLEN] = "";

或者:

     char line[WORDLEN];
     line[0] = '\0';

现在您可以安全地执行注释操作,包括(特别是)strcat(). (好吧,假设您可以strcat()安全地做到这一点 - 只要您知道目标字符串中已有数据的长度、目标字符串缓冲区的大小和附加字符串的长度,并检查了那里有足够的空间来存放你想要的东西。如果你不知道有足够的空间,那么你正在走向崩溃。

     //do stuff to line, including strcat(line, "words")
     printf("%s", line);
     line[0] = '\0';

由于循环开始时的初始化,结束时的这个赋值是多余的。

}
于 2010-09-16T03:57:42.230 回答
1

每次循环时,您都在重新声明 line。

编辑:你正在用指针做一些奇怪的事情。line是声明中的 char 指针数组!尝试这个:

char line[WORDLEN];
while(some condition)
{
     line[0] = '\0';
     //do stuff to line, including strcat(line, "words")
     printf("%s", line);

}
于 2010-09-16T03:52:48.070 回答