为什么 Ctrl-Z 不触发 EOF?

Why Ctrl-Z does not trigger EOF?

提问人:Alex 提问时间:7/7/2015 最后编辑:CommunityAlex 更新时间:7/7/2015 访问量:10265

问:

为什么 + 不触发循环在以下小程序上完成?CtrlZ

#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

C visual-C++ EOF getchar

评论

1赞 Spikatrix 7/7/2015
@ARBY,CTRL+C不发,对吧?EOF
1赞 Raman 7/7/2015
@CoolGuy 哦,对不起,我的意思是 ctrl+D 和 *nix 一样。
0赞 Ediac 7/7/2015
stackoverflow.com/questions/1782080/......
0赞 Raman 7/7/2015
此链接可能会有所帮助(stackoverflow.com/questions/11378899/...)
4赞 Spikatrix 7/7/2015
@Alex 您的问题在您提供的第一个链接中得到了明确的解释。简而言之,由于有字符要刷新到 stdin 中,因此 CTRL+Z 和 Enter 会刷新这些字符,而不是发送 EOF。换句话说,如果没有更多字符要刷新到 stdin,则 CTRL+Z(windows、DOS)和 CTRL+D(Linux、Unix、OSX 等)会发送 EOF。

答:

-4赞 Marcus Müller 7/7/2015 #1

EOF就像你用的,它不是一个字符。这是该流所处的状态。

我的意思是,哎呀,你甚至把这个问题联系起来,所以你不妨阅读公认的答案

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

它不是“EOF 字符”。

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

评论

0赞 user2864740 7/7/2015
那么,为什么 Ctrl+Z 不触发 EOF 的“该流所处的状态”呢?
0赞 Marcus Müller 7/7/2015
它可能确实如此,但您没有检查这一点。
1赞 user2864740 7/7/2015
那么如何用getchar()检查它呢?
1赞 user2864740 7/7/2015
显然人们喜欢这样做
4赞 user2864740 7/7/2015
所引用案例中的问题是用作变量;发布的代码正确使用 ,它可以检测 EOF“带外”状态。charint
5赞 Raman 7/7/2015 #2

您需要点击,然后使用 +,然后再使用。EnterctrlZEnter

或者,您也可以使用F6