为什么Ctrl-Z不能触发EOF?

6
为什么在以下小程序中,Ctrl+Z不能触发循环结束?
#include <stdio.h>

main()
{
    int c;
    while ((c = getchar()) != EOF)
    {
        //nothing 
    }

    return 0;
}

如果我输入:test^ZEnter,它就不会跳出循环。我在这里找到了相关问题(这里这里),但没有一个是用于在Windows下的C语言(而不是C++)解释的。
注意:我在Windows 8.1上使用Visual Studio 2015 PRE。

1
@ARBY,CTRL+C不会发送EOF,对吧? - Spikatrix
1
@CoolGuy 对不起,我的意思是 *nix 中的 ctrl+D。 - Raman
@ARBY 我知道那篇帖子(请参见最初的问题),但不是很清楚。 - Alex
@ARBY 这不是与此问题提供的相同链接吗? - Spikatrix
4
@Alex,你的问题在你提供的第一个链接中有清晰的解释。简而言之,由于存在要刷新到stdin的字符,因此CTRL + Z和回车键会将这些字符刷新而不是发送EOF。换句话说,CTRL + Z(Windows,DOS)和CTRL + D(Linux,Unix,OSX等)仅在没有其他字符要刷新到stdin时才发送EOF - Spikatrix
显示剩余3条评论
2个回答

5

您需按下 Enter 键,然后使用 ctrl+Z 快捷键,再次按下 Enter 键。

或者,您也可以使用 F6 键。


-4

EOF 就像你使用它一样,并不是一个字符。它是流的状态。

我的意思是,你甚至链接了这个问题,所以你可能也应该阅读被接受的答案

EOF 的基本形式是零长度读取。

它不是“EOF 字符”。

http://www.c-faq.com/stdio/getcharc.html 引用了一个与你的情况不同的案例,其中有人将 getchar 的返回值存储在一个 char 中。底层问题仍然偶尔会发生:不同的运行时实现对于 EOF 整数 有不同的值(这就是为什么我说,它不是 EOF 字符),而且事情很容易出错。特别是在 Visual C++ 中,它不是一个“真正”的 C 编译器,而是一个带有兼容模式的 C++ 编译器,似乎事情会出错。


1
如何使用getchar()检查它呢? - user2864740
这就像是在问“我该如何挖掘鱼”。 - Marcus Müller
1
显然人们喜欢这样做 - user2864740
那是非常古老的遗留行为。我建议采用符合标准的方式,检查 feof(stdin) 是否返回 true。 - Marcus Müller
4
在引用的案例中,问题在于使用char作为变量;发布的代码正确地使用了int,可以检测EOF的“带外”状态。 - user2864740
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接