Linux下while(scanf(...))循环未响应Ctrl+D退出的问题咨询
为什么Ctrl+D在两种scanf循环中表现不同?
这是个很常见的对scanf返回值理解不到位导致的问题,我给你拆解清楚:
首先得搞懂scanf的返回值到底代表什么
scanf的返回值不是“是否读取到数据”这么简单,它有三种可能:
- 返回1:成功按照指定格式(这里是
%d)读入了一个整数,这是我们期望的正常情况 - 返回0:输入的内容和指定格式不匹配(比如你输入了字母
abc而不是数字),此时没有任何数据被读入,输入流里的错误内容还会留在那里 - 返回EOF:遇到了文件结束符(也就是你按Ctrl+D触发的信号),或者读入时发生了错误。在C标准里,
EOF是一个宏,值通常是-1(非零值)
两种循环条件的本质差异
现在看你写的两种循环:
while( scanf("%d", &n) )
C语言里,while的判断条件是“表达式是否为非零值”——非零即真,零即假。
当你按Ctrl+D时,scanf返回EOF(也就是-1),这是一个非零值,所以while条件会被判定为“真”,循环会继续执行,程序自然不会退出。
反而如果输入了不匹配的内容(比如字母),scanf返回0,条件为假,循环会退出——这和你遇到的EOF情况刚好相反。while( scanf("%d", &n) == 1 )
这个条件非常明确:只有当scanf成功读入一个整数(返回值等于1)时,才继续循环。
当你按Ctrl+D,scanf返回EOF(-1),显然不等于1,条件不成立,循环终止,程序也就正常退出了。
额外提醒
如果你想用第一种写法实现退出,其实可以改成while( scanf("%d", &n) != EOF ),但这时候要注意处理输入不匹配的情况(比如输入字母时,scanf返回0,循环会一直跑,因为0不等于EOF),所以通常更推荐用==1的写法,能同时过滤掉EOF和输入不合法的情况,让程序行为更可控。
内容的提问来源于stack exchange,提问作者callofdutyops
相关产品推荐
相关产品推荐

