2

这是一个基本问题..但不得不问。对于这样的程序,如果用例是 123^Z,则程序不会终止,即使我在末尾放置了 EOF (Ctrl+Z)。为什么呢?只有当我在 CR 之后放置 EOF 时它才会起作用。任何答案将不胜感激。谢谢。

#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);
}
4

1 回答 1

7

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

在 Unix 中,Ctrl-D 快捷方式将立即刷新stdin(如下面的注释中所述),但不会导致getchar()返回EOF,除非您位于新的空白行上;与在 Windows 中相同。

来自评论(如下):

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

这解决了一个很好的问题——实际上没有文件包含 EOF——并且按下 Ctrl-D 不会“插入”(正如我之前所说的)任何东西到stdin流中。它只是冲洗stdinEOF是一个标准宏,表示标准函数已到达文件末尾的通知。

感谢@R。关于 的解释EOF

于 2012-03-20T22:52:40.557 回答