为何scanf期望整数时输入小数,先返回1后返回0致循环终止?
问题描述
运行以下C语言代码时,若输入小数(例如5.55),首次调用scanf会返回1并输出整数部分5,但第二次调用scanf直接返回0,循环随即终止。这是什么原因?
#include <stdio.h> int main(){ int num = 1; while(num != 0){ printf("input integer: "); if(scanf("%d", &num) == 0) break; printf("out: %d\n", num); } return 0; }
原因解析
核心原因是输入缓冲区的残留数据干扰了后续的scanf调用:
- 第一次执行
scanf("%d", &num)时,%d格式符只会读取连续的数字字符。输入5.55时,它会读取5并转换成整数赋值给num,但输入里的.55会留在输入缓冲区中,不会被处理。 - 第二次调用
scanf("%d", &num)时,它会从缓冲区的当前位置开始读取。此时缓冲区第一个字符是.,不属于整数的有效字符范围,scanf无法读取到有效整数,因此返回0(表示成功匹配的输入项数为0),触发break语句终止循环。
内容的提问来源于stack exchange,提问作者Sixtenson
相关产品推荐
相关产品推荐

