【问题标题】:c - fgets never return \0 and cause a infinite loopc - fgets 永远不会返回 \0 并导致无限循环
【发布时间】:2021-09-30 00:04:57
【问题描述】:

我试图做一个while循环从标准输入读取一些字符串,但它永远不会结束

 fgets(string,stringlenght,stdin);
 while (string[0] != '\0') {
     ///some stuff here
     fgets(string,stringlenght,stdin);
 }

现在,无论我做什么,循环都不会结束,我尝试使用 ctrl+d 和 ctrl+z 但两者都没有工作。 这样的循环如何结束?

【问题讨论】:

  • 请记住 fgets() 保留换行符(如果数组中有空间)。所以一个“空字符串”将是"\n"
  • while(fgets(...)) {...}
  • @interjay 在这里有正确的答案:您必须检查来自 fgets()返回值 来确定 EOF,而不是检查缓冲区来确定。
  • 您错过的是,当您到达文件末尾并且fgets() 无法读取更多数据时,它将旧数据留在缓冲区中。您读取数据的任何缓冲区的内容永远不会可靠地告诉您以任何方式读取数据的尝试是否有效。这就是返回值的作用。

标签: c string while-loop stdin fgets


【解决方案1】:

fgets 永远不会返回 \0 并导致无限循环

fgets() 确实在文件结束时返回 0(又名 NULL)(并且没有读取内容)。

OP 的代码不是测试fgets() 的返回值,而是一个缓冲区中的值。而是测试函数返回值。

//fgets(string,stringlenght,stdin);
//while (string[0] != '\0') {

while (fgets(string, stringlenght, stdin)) {

更好的例子

char buf[100];
while (fgets(buf, sizeof buf, stdin)) {
  // Lop off \n which may exist near the end of input
  buf[strcspn(buf, "\n")] = 0;
  ...

这样的循环如何结束?

对于书呆子:有一些方法可以使string[0] != '\0' 为假。一个涉及读取 null 字符,(例如在选择键盘上键入 Ctrl Shift @),但这取决于实现. 空字符在文本输入中很少见。

当然,OP 的方法是错误的,测试 fgets() 返回是最好的方法。


拼写:lenght --> length

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-24
    • 2017-08-19
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多