C语言 为什么这个 fgets() 循环永远不会结束


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 1024
int main ()
{
    char buffer[BUF_SIZE];
    int contentSize = 1; 
    char* content = (char*)malloc(sizeof(char) * BUF_SIZE);
    content[0] = '';
    while(fgets(buffer, BUF_SIZE, stdin))
    {
        contentSize = contentSize + strlen(buffer);
        content = (char*)realloc(content, contentSize);
        strcat(content, buffer);
    }
    return 0;
 }

试图读取用户输入的所有内容(甚至是空格字符),我非常接近让它工作,但循环永远不会结束。 fgets()只是不断要求更多输入,请问我该如何解决这个问题。

fgets()返回指向您传递给它的缓冲区(最好不是NULL指针)的指针,直到它无法从文件中读取更多行。

当然,如果从标准输入读取,它将始终等待另一行,因此您必须显式向终端发送EOF,以便它报告文件结束。您可以通过按 <ctrl> + <D> ,例如。

一种方法是让用户输入某些关键字(如 quit 或 quit()),然后中断 while 循环。

while(fgets(buffer, BUF_SIZE, stdin)) {
           contentSize = contentSize + strlen(buffer);
           content = (char*)realloc(content, contentSize);
           strcat(content, buffer);
           if (strncmp(buffer, "quit", strlen("quit")) == 0) {
               break;
           }
}

循环永远不会结束,因为 OP 没有关闭stdin。 关闭stdin并读取所有数据后,fgets()将返回 NULL。

@H2CO3解决方案是有目标的,但OP可能错过了一些窗口的微妙之处。

如果输入缓冲区为空并且后跟 Enter,则 <Ctrl>+<Z> 将发出 EOF 信号。 示例 ABCEnter现在是空缓冲区<Ctrl>+<Z>Enter

如果输入缓冲区全部就绪,则<Ctrl>+<Z>读取为<Ctrl>+<Z> (ASCII 26)。

"退出"的想法有优点,但用户仍然可以输入<Ctrl>+<Z>Enter。 代码应该为此做好准备。 (发布的"退出"答案就是这样做的。 我建议避免使用魔术词——除非它的"放弃法典"。

相关内容

  • 没有找到相关文章

最新更新