1
#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()只是一直要求更多输入,请问我该如何解决。

4

3 回答 3

3

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

当然,如果从标准输入读取,它总是会等待另一行,所以你必须显式地向终端发送一个 EOF以便它报告文件结束。例如,您可以通过按 来执行此操作<ctrl> + <D>

于 2013-09-08T08:35:01.967 回答
0

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

@H2CO3 解决方案是目标,但 OP 可能错过了一些 Windows 细节。

如果输入缓冲区为空并且后面跟着 . A<Ctrl>+<Z>将发出 EOF 信号Enter。示例A, B, C,现在是一个空缓冲区Enter, , .<Ctrl>+<Z>Enter

如果输入缓冲区已就绪,其中有数据,则将 a<Ctrl>+<Z>读取为<Ctrl>+<Z>(ASCII 26)。

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

于 2013-09-10T19:29:47.717 回答
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;
           }
}
于 2013-09-08T08:36:03.493 回答