提问人:Oliver 提问时间:12/10/2022 更新时间:12/11/2022 访问量:221
如何使用 fgets() 从 stdin 中读取?
How to read from stdin with fgets()?
问:
我的教授写了一个关于fgets的C代码,feof使用stdin。 但我不明白它是如何工作的。
fgets(list, 100, stdin);
while (!feof(stdin))
{
printf("feof!");
fgets(list, 100, stdin);
}
当我写一个“你好”时,函数 while 正在工作。 为什么feof(stdin)返回0?
我认为首先读取所有字符串(包括'\0')的stdin缓冲区。 因此我认为虽然不应该工作,因为 feof(stdin) 返回 1 我怎么了?
答:
1赞
chux - Reinstate Monica
12/11/2022
#1
提示:始终检查输入函数和大多数其他 I/O 函数的返回值。
fgets(list, 100, stdin); // Weak code
是的,在循环内调用具有误导性,因为在给定先前的测试条件的情况下,未设置文件结束指示器。printf("feof!");
stdin
while (!feof(stdin))
如何使用 fgets() 从 stdin 中读取?
不要将 feof()
用于此任务进行主要检测
fgets()
在以下情况下返回:NULL
在上一个输入操作中刚刚发生文件结束。
甚至在此之前,某些输入操作中就已经发生了文件结束。
刚刚发生输入错误。示例:要读取的文件是某些串行通信上的输出流或奇偶校验错误。
while (!feof(stdin))
仅检测 1 和 2。
除非检查 的返回值,否则使用可能会有问题。fgets(list, 100, stdin)
list
feof()
在 I/O 函数返回需求的可能性后很有用。
尺寸到物体,避免幻数
好用法:
char list[100];
while (fgets(list, sizeof list, stdin)) {
printf("%s", list):
}
if (feof(stdin)) {
puts("End-of-file");
} else if (ferror(stdin)) {
puts("Error");
} else {
puts("Unexpected state");
}
评论
1赞
David C. Rankin
12/11/2022
总是非常翔实和完整。太糟糕了,我们可以把它“弹出”回关于这个主题的教科书中。
评论
feof
返回 “true”(非零)。对于终端输入,当您按下文件结束键盘序列时(在 Linux 或 macOS 上,在 Windows 中的新行上)会发生这种情况。stdin
Ctrl-D
Ctrl-Z
fgets()
'\n'
'\0'