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

C语言scanf读取整数时输入字符串触发while死循环的原因及解决方法

问题产生原因
  • 当调用scanf("%d", &userInput)时,函数仅会匹配输入流中的整数格式内容。如果输入为字符串,格式匹配失败,scanf会直接返回0,且不会将输入流中的非法数据取出,这些内容会一直滞留在输入缓冲区中。
  • 下一次循环调用scanf时,会直接读取缓冲区中残留的非法内容,再次匹配失败,陷入死循环。重置userInput变量的操作不会改变输入缓冲区的状态,因此无法解决问题。
修复方案

修复核心逻辑是输入匹配失败时清空输入缓冲区的残留内容,同时可增加返回值判断提示非法输入,避免使用标准未定义的fflush(stdin)操作,示例修复代码如下:

#include <stdio.h>
int main() {
    int userInput = 0;

    while (userInput != 4) {
        printf("Enter a number : ");
        // 判断scanf返回值,匹配成功时返回值等于要读取的参数个数1
        if (scanf("%d", &userInput) != 1) {
            // 循环读取缓冲区内容,直到清空到换行符或输入结束为止
            int tmp;
            while ((tmp = getchar()) != '\n' && tmp != EOF);
            printf("输入不合法,请输入整数\n");
            // 重置userInput避免非法值影响循环判断
            userInput = 0;
        }
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:45:03