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

C语言输入非int类型字符时do-while校验scanf返回值触发死循环问题

问题成因
  • scanf匹配输入失败时,不会自动丢弃输入缓冲区中无法匹配的内容,错误输入会永久残留在缓冲区内。
  • 当你输入非int类型数据后,scanf("%d", &n)返回0进入下一轮循环,后续scanf会直接读取缓冲区里残留的错误数据,再次匹配失败,由此形成无限循环,不会等待新的用户输入。
解决办法

匹配失败后主动清空输入缓冲区的残留内容即可,推荐使用跨平台的标准实现,不要用非标准的fflush(stdin)(仅在部分编译器上生效,可移植性极差)。
修改后的参考代码如下:

int n;
do {
    printf("请输入int类型数据:");
    if (scanf("%d", &n) == 1) {
        // 输入合法,跳出循环
        break;
    }
    // 逐字符读取缓冲区内容直到换行符,清空所有错误残留
    while (getchar() != '\n');
    printf("输入不合法,请重新输入\n");
} while (1);

内容的提问来源于stack exchange,提问作者theEncrypter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:00:00