问题描述
下面是我的课本中的一段代码:
#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
?
问题2-为什么需要使用feof
测试EOF
的{{1}}指标?我们可以摆脱stdin
的输出是相同的。
解决方法
Q1-如果我在shell中运行该程序并开始键入,如何将EOF指示为stdin?我已经尝试过Ctrl + D,但是在按Enter键之前我仍然可以继续输入,所以Enter更像是EOF到stdin?
Why do I need to type Ctrl-D twice to mark end-of-file?
问题2-为什么需要使用
feof
测试EOF
的{{1}}指标?我们可以摆脱stdin
的输出是相同的。
输出是相同的,因为尚未使用立即结束的文件对代码进行测试。
if (feof(stdin)) exit(0);
返回fgets()
时,是由于文件结尾或罕见的输入错误。
测试NULL
是测试feof(stdin)
中是否包含有效数据的不良方法。它简单地报告检测到文件结束。如果为true,则cmdline
中可能包含有效数据,也可能没有有效数据。如果为false,则cmdline
具有有效的数据(如果不仅仅是发生输入错误)。当错误和刚刚发生输入错误时,cmdline
会不确定。
在任何情况下,这都不足够。最好测试cmdline[]
的返回值。
fgets()