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

C语言读取非整数输入后无法扫描变量且陷入死循环的排查与修复

问题原因与修复方案

为什么会陷入无限循环?

用scanf("%d", &answer)读取整数时,如果输入的是字符、字符串这类非整数内容,会触发以下C语言输入机制:

  • scanf匹配失败,不会修改answer的取值,它会保持未初始化的垃圾值或上一次的错误值
  • 输入缓冲区里的无效内容不会被自动清空,下一次循环scanf会直接读取这些残留的无效输入,再次匹配失败,反复循环
  • 另外,原代码里answer未初始化,第一次进入while(answer != 3)时,answer是随机值,属于未定义行为,可能导致程序一开始就不符合预期。

修复后的代码

#include <stdio.h>
#include <ctype.h>

int main( ){
    int answer = 0; // 初始化变量,避免未定义行为
    printf("Hello\n");

    while (answer != 3){
        // 检查scanf返回值:成功读取整数时返回1
        if (scanf("%d", &answer) != 1) {
            // 清空输入缓冲区的无效内容
            int c;
            while ((c = getchar()) != '\n' && c != EOF) {
                // 跳过所有非换行的字符
            }
            printf("Invalid input\nTry again\n\n");
        } else {
            switch (answer) {
                case 3:
                    break;
                default:
                    printf("Invalid input\nTry again\n\n");
                    break;
            }
        }
    }

    return 0;
}

关键改动说明

  • 初始化answer:给变量赋初始值0,避免进入循环时的随机值问题
  • 检查scanf返回值:通过判断返回值是否为1,精准识别整数读取失败的情况
  • 清空输入缓冲区:读取失败时,用getchar()逐个清空缓冲区里的无效字符,确保下一次scanf能读取新的输入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:52:10