这是一个基本问题..但不得不问。对于这样的程序,如果用例是123 ^ Z,程序不会终止,即使我在末尾放置了一个EOF(Ctrl + Z)。为什么会这样?只有当我在CR之后放置EOF它才有效。任何anwers将不胜感激。感谢。
#include < stdio.h>
void main()
{
int i, nc;
nc = 0;
i = getchar();
while (i != EOF) {
nc = nc + 1;
i = getchar();
}
printf("Number of characters in file = %d\n", nc);
}
答案 0 :(得分:6)
在Windows中,只有在行开头按下Ctrl-Z快捷键才会生效。否则,操作系统会忽略它。您必须先按“回车”或“返回”才能插入换行符。
在Unix中,Ctrl-D快捷键会立即刷新stdin
(如下面的评论中所述),但不会导致getchar()
返回EOF
,除非你是新的, 空行;与Windows中相同。
从评论(下文):
Unix上没有“EOF字符”。 EOF只是一个零长度读取。它发生在普通文件的末尾,并且可以通过按下在EOF的终端设置中设置的控制字符(通常是^ D)强制在终端上。当终端缓冲区非空时,^ D“不起作用的原因是它实际上没有在流中插入某些东西;它只会导致挂起的读取返回,但由于输入长度非零,因此应用程序不会将其视为“EOF”。
这解决了一个好点 - 实际上没有文件包含 EOF
- 按Ctrl-D不会“插入”(如我之前所说)任何内容{{1流。 只是刷新stdin
。 stdin
是一个标准宏,表示标准函数已到达文件末尾的通知。
感谢@R。关于EOF
的解释。