You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:30:54