C输入 - getchar()

Ice*_*man 2 c windows getchar

这是一个基本问题..但不得不问.对于这样的程序,如果用例是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);
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*wne 6

在Windows中,只有在行开头按下Ctrl-Z快捷键才会生效.否则,操作系统会忽略它.您必须先按"enter"或"return"才能插入换行符.

在Unix中,Ctrl-D快捷键会stdin立即刷新(如下面的注释中所述),但除非你在一个新的空白行,否则不会getchar()返回EOF; 与Windows相同.

从评论(下面):

Unix上没有"EOF字符".EOF只是一个零长度读取.它发生在普通文件的末尾,并且可以通过按下在EOF的终端设置中设置的控制字符(通常是^ D)强制在终端上.当终端缓冲区非空时,^ D"不起作用的原因是它实际上没有在流中插入某些东西; 它只会导致挂起的读取返回,但由于输入长度非零,因此应用程序不会将其视为"EOF".

这解决了一个好点 - 没有文件实际包含 EOF - 并按Ctrl-D不会"插入"(如我之前所说)任何内容stdin.它只是冲洗stdin. EOF是一个标准宏,表示标准函数到达文件末尾的通知.

感谢@R.关于解释EOF.