如果使用此代码读取int
号码,当我按Ctrl + D时,此程序不会退出。
while( scanf("%d", &n) ) { ... }
但如果我使用它,它将退出。
while( scanf("%d", &n) == 1 ) { ... }
我测试此代码的操作系统是Linux,编译器是g ++ 7.3.1。
答案 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
获取缓冲区内容。这就是你获得无限循环的原因。然后它与你输入的内容无关。