【发布时间】:2020-09-10 03:49:46
【问题描述】:
下面是我教科书中的一段代码:
#define MAXLINE 8192
int main()
{
char cmdline[MAXLINE];
fgets(cmdline, MAXLINE, stdin);
if (feof(stdin))
{
exit(0);
}
printf("the string is %s", cmdline);
exit(0);
}
而fgets的定义是
从指定的流中读取一行并将其存储到str指向的字符串中。当读取 (n-1) 个字符、读取换行符或到达文件结尾(以先到者为准)时,它会停止。
我的问题是:
Q1-如果我在shell中运行这个程序并开始输入,我如何将EOF指示为stdin?我试过 Ctrl + D,但我仍然可以继续输入直到我按 Enter,所以 Enter 更像是EOF 到 stdin?
Q2-为什么需要使用feof 来测试EOF 指标为stdin?我们可以去掉if (feof(stdin)) exit(0);,输出是一样的。
【问题讨论】:
-
“输出相同”。这并非适用于所有情况。如果用户立即输入 EOF,那么当前代码将不会打印任何内容,而建议的修改最终会打印垃圾。
-
@kaylum 我按以下键序列:
a,b,c,Ctrl + D,d,然后按 Enter,输出为abcd,而不是@987654338 @,但是我在c之后已经指明了EOF,那么如何将EOF发送到stdin? -
在回答 Q2 时,编写代码的正确方法是检查来自
fgets的返回值。当fgets返回NULL 时,cmdline数组将不包含任何数据,不应使用。所以代码应该是if (fgets(cmdline, MAXLINE, stdin) != NULL) printf("the string is %s", cmdline);一般来说,你永远不需要使用feof,我认为应该从语言中删除feof。 -
@user3386109
feof()有助于区分or 3 原因fgets()返回NULL。 -
如果
EOF出现在第一行在某些字符之后 (即你按^D两次没有回车),那么你写的就是你写的任何东西,但没有@987654351 @ 在缓冲区中。您的代码不会打印它,而是无论如何都退出。代码被破坏了。如果有任何书建议这种方法,请烧掉这本书。
标签: c