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

时间:2013-09-08 08:28:33

标签: c stream while-loop buffer 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] = '\0';

    while(fgets(buffer, BUF_SIZE, stdin))
    {
        contentSize = contentSize + strlen(buffer);
        content = (char*)realloc(content, contentSize);
        strcat(content, buffer);
    }

    return 0;
 }

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

一种方法是让用户输入某些关键字(如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;
           }
}

答案 2 :(得分:0)

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

@ H2CO3解决方案正在实现目标,但OP可能已经错过了一些Windows细微之处。

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

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

“退出”的想法很有用,但用户仍然可以输入<Ctrl>+<Z>Enter。代码应该为此做好准备。 (发布的“退出”答案就是这样。)我建议避免使用魔术词 - 除非它的“相关的抄本”。