为什么我必须键入 CTRL + Z 3 次才能发送 EOF?

Why do I have to type CTRL + Z 3 times to send EOF?

提问人:orangetimes 提问时间:10/11/2015 最后编辑:Spikatrixorangetimes 更新时间:10/11/2015 访问量:2962

问:

int x, sum=0;
while(scanf_s("%d", &x) != EOF) 
{
    sum += x;  
}
printf("sum is %d", sum);
return 0;

无论如何输入,我都必须输入+三遍才能打印。我正在使用 VS 2015。CTRLZsum

C visual-studio-2015 扫描 EOF

评论

0赞 Fiddling Bits 10/11/2015
不应该这样使用(在你的情况下):?scanf_sscanf_s("%d", &x, 1)
1赞 Spikatrix 10/11/2015
@FiddlingBits 没有。仅当使用 时才需要额外的参数 , 或 。%c%s%[
0赞 Spikatrix 10/11/2015
您能否发布一个最小的可重复示例以及示例输入和输出?
0赞 orangetimes 10/12/2015
感谢您的评论,我发现在 VS2008 上使用该代码,它有效。所以,VS2015 有问题。也使用和安装,它不起作用#pragma warning (disable : 4996)scanfscanf_s
1赞 Joel Trauger 10/14/2015
为什么我需要多个 EOF (CTRL+Z) 字符?

答:

-2赞 Joel Trauger 10/11/2015 #1

EOF 是一个特殊的常量,只有在读取文件以检查文件末尾时才应使用

End Of the File 就是它所代表的,并且是一种方便的方式来表示它,而无需记住它的实际价值。

按 Ctrl + Z 会导致不同的行为,具体取决于系统。在 Linux 系统上,它会挂起进程。在 Windows 上,它被内核解释为撤消命令。它在 Mac OS 上没有行为,并被 CMD + Z 取代,其功能类似于 Windows Ctrl + Z。

scanf_s返回一个,即从输入中读取的字符数。int

评论

0赞 Fiddling Bits 10/11/2015
好信息,但这是评论,而不是答案。
0赞 Joel Trauger 10/14/2015
@FiddlingBits 然后发布一个“实际”的答案,而不是抱怨它。他想知道为什么他必须按 Ctrl + Z 3 次。我的回答是因为行为是未定义的。
0赞 Joel Trauger 10/14/2015
@FiddlingBits 如果批评是非建设性的,我不会接受批评,就像你的评论一样。查看我的个人资料,了解人们纠正我的其他地方。如果他们提供正确的答案,而不仅仅是说“你错了”,我会很好。