【问题标题】:Terminating loop with fgets()使用 fgets() 终止循环
【发布时间】:2012-07-17 09:14:57
【问题描述】:

我正在使用fgets()扫描文件如下:

char buf[50];
if (fgets(buf, 50, fp) == NULL) {
  printf("Error in file parsing.\n");
  exit(1);
}
char *p;
p = buf;

p 指向缓冲区,我正在使用它来遍历扫描的字符串。 fgets() 的大小为 50,但它确实在扫描字符串的末尾添加了一个空终止符。

我的 while 循环如下所示:

while (*p != '\0')

当我的文本文件有:1 + 23 时,这有效。当文本文件包含1 + 23 - 5 时,它会陷入无限循环。为什么会这样?

我还尝试检查\n,但也失败了。最后,我使用了strlen 并根据strlen 运行了一个for 循环,但这并不准确。

关于我的 while 循环应该是什么样子的任何建议?

【问题讨论】:

  • 显示更多代码。您可能忘记增加 p ,或者在其他地方出现错误。检查 '\0' 是正确的方法。 strlen() 非常“准确”,因此也表明其他地方有错误。
  • 除了如@nos 所指出的那样忘记递增之外,您还可以将p 递增一次到多次并跳过终止的'\0'
  • 真的很想看看整个循环。尝试删除不相关的部分,同时保留重现问题的内容。
  • 我确实增加了p。我认为问题在于我正在增加\0。我想我需要检查我多次增加p 的位置,如果找到\0,就跳出循环。 @JoachimPileborg 你说得对。

标签: c file-io fgets


【解决方案1】:

为什么不迭代如下:

int i, buflen;
buflen = strlen(buf);
for(i=0; i<buflen; i++) {
   // your code on buf[i]
}

【讨论】:

  • Some compilers may call strlen each time。最好在循环之外调用它。
  • 我就是这样做的。请参阅上面的 cmets。
  • @Darksky:按照我的建议,迭代字符串更为常见。
  • @A_nto2 我试过了,但也失败了。那是因为我正在从字符串中读取字符和整数。我像往常一样使用*p 读取字符,然后递增p。至于整数,我使用sscanf,然后我使用log计算该数字的位数,并以此递增p(以便跳到整数之后的下一个字符)。使用buf[i],我仍然需要使用sscanf 并计算一个数字的长度以跳到下一个i。所以这仍然会带来同样的问题,并且我的循环注定要使用 i+1 增量
  • @Darksky 实际上,您应该显示给出问题的完整代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多