#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 信号。 示例 A
、 B
、 C
、 Enter
,现在是空缓冲区,<Ctrl>+<Z>
、 Enter
。
如果输入缓冲区全部就绪,则<Ctrl>+<Z>
读取为<Ctrl>+<Z>
(ASCII 26)。
"退出"的想法有优点,但用户仍然可以输入<Ctrl>+<Z>
,Enter
。 代码应该为此做好准备。 (发布的"退出"答案就是这样做的。 我建议避免使用魔术词——除非它的"放弃法典"。