Why Ctrl-Z does not trigger EOF?
为什么Ctrl + Z不触发循环在以下小程序上完成?
1 2 3 4 5 6 7 8 9 10 11 12
| #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
-
@ARBY,CTRL + C不会发送EOF,对吗?
-
@CoolGuy哦,抱歉,我的意思是ctrl + D,如* nix所示。
-
stackoverflow.com/questions/1782080/
-
该链接可能有帮助(stackoverflow.com/questions/11378899/)
-
我知道该帖子的@ARBY(请参阅初始问题),但不是很清楚
-
@ARBY是不是这个问题提供了相同的链接?
-
@Alex您提供的第一个链接中清楚地说明了您的问题。 简而言之,由于有些字符要刷新到标准输入中,所以按CTRL + Z并输入即可刷新这些字符,而不发送EOF。 换句话说,如果没有更多要刷新到stdin的字符,则CTRL + Z(Windows,DOS)和CTRL + D(Linux,Unix,OSX等)将发送EOF。
-
@CoolGuy谢谢,您应该将其发布为接受它的答案。
您需要打Enter,然后使用ctrl + Z,然后再次使用Enter。
或者,您也可以使用F6
像您使用的EOF不是字符。 这是流的状态。
我的意思是,哎呀,您甚至链接了这个问题,因此您最好阅读已接受的答案:
The underlying form of an EOF is a zero-length read.
这不是" EOF字符"。
http://www.c-faq.com/stdio/getcharc.html引用的情况与您的情况不同,有人将getchar的返回值存储在char中。 潜在的问题仍然偶尔发生:不同的运行时为EOF整数实现不同的值(这就是我说的,它不是EOF字符的原因),事情总是会出错。 特别是在Visual C ++中,它不是"真正的" C编译器,而是具有兼容模式的C ++编译器,看来情况可能会出错。
-
那么,为什么Ctrl + Z不会触发EOF的"该流所在的状态"?
-
它可能会,但是您不进行检查。
-
那么如何使用getchar()检查它呢?
-
那就像问"我如何挖掘鱼"。
-
显然,人们喜欢这样做。
-
那真的是非常古老的传统行为。我建议按照标准兼容的方法检查feof(stdin)是否返回true。
-
有趣的是,此手册页还喜欢挖鱼。请为getchar / getc提供"非旧版"参考。
-
@ user2864740:是的,但是请仔细阅读该函数原型!什么是退货类型?它是一个int,我认为确实如此,因为他们希望能够读取char或返回错误。现在,他们所做的就是将EOF用于所有错误和文件结尾。使用EOF来检查文件结尾已经有一段时间了。病加参考。
-
在引用的情况下,问题是使用char作为变量。发布的代码正确使用了int,它可以检测EOF的"带外"状态。