while(scanf("%d",& n)){...}在Linux上按Ctrl + D时不退出

时间:2018-04-29 14:24:26

标签: c++ c scanf

如果使用此代码读取int号码,当我按Ctrl + D时,此程序不会退出。

while( scanf("%d", &n) ) { ... }

但如果我使用它,它将退出。

while( scanf("%d", &n) == 1 ) { ... }

我测试此代码的操作系统是Linux,编译器是g ++ 7.3.1。

2 个答案:

答案 0 :(得分:5)

你写的第一个代码:

while( scanf("%d", &n) ) { ... }
如果 scanf为成功返回true而失败则为false,

将正常工作。但那不是scanf返回的内容。

scanf实际上返回成功匹配的项目数。或者如果没有匹配则返回0。或者(这是关键点)如果达到文件结尾,则返回负值EOF(通常为-1),例如当您键入control-D时。

只要scanf返回非零值,您编写的第一个代码就会循环。这就是它永远循环的原因。

你写的第二个代码:

while( scanf("%d", &n) == 1 ) { ... }
只要scanf成功匹配它要求您的一个项目,就会

循环。这是正确的方法,这就是它起作用的原因。

答案 1 :(得分:0)

第一次读取后,scanf获取缓冲区内容。这就是你获得无限循环的原因。然后它与你输入的内容无关。