#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()
只是不断要求更多输入,我该如何解决这个问题。
答案 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
。示例A
,B
,C
,Enter
,现在是空缓冲区,<Ctrl>+<Z>
,Enter
。< / p>
如果输入缓冲区全部准备就绪,则<Ctrl>+<Z>
读取为<Ctrl>+<Z>
(ASCII 26)。
“退出”的想法很有用,但用户仍然可以输入<Ctrl>+<Z>
,Enter
。代码应该为此做好准备。 (发布的“退出”答案就是这样。)我建议避免使用魔术词 - 除非它的“相关的抄本”。