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

C语言scanf输入字母或符号时触发while死循环的解决方案问询

C语言scanf读取非数字输入触发死循环解决方案

死循环产生原因

使用%d格式符调用scanf时,如果输入非数字内容,会触发以下逻辑:

  • scanf匹配失败,返回值为0(代表成功赋值的参数数量为0)
  • 非法的非数字内容不会被从输入缓冲区中移除,一直残留等待下次读取
  • 传入的int类型变量不会被修改,保留原有数值
    循环中scanf每次都读取到相同的非法内容,匹配失败后变量值始终不符合退出条件,就会产生无限死循环。

修复步骤

核心修改逻辑

  • 新增输入缓冲区清空函数:非法输入后将缓冲区所有残留内容(包括错误输入、换行符)全部丢弃
  • 每次调用scanf后校验返回值,只要返回值不为1(未成功读取到int)、或者读取到的数值不是0/1,就判定为非法输入
  • 所有输入变量初始化赋值为非法值,避免未初始化的随机值干扰校验逻辑

缓冲区清空函数实现

void clear_input_buffer() {
    int temp;
    // 循环读取缓冲区内容直到遇到换行符或者输入结束符
    while ((temp = getchar()) != '\n' && temp != EOF);
}

修复后的完整代码

#include <stdio.h>
#include <conio.h> // 为了兼容_getch函数,部分编译器可按需移除

void clear_input_buffer() {
    int temp;
    while ((temp = getchar()) != '\n' && temp != EOF);
}

int main()
{
    // 初始化变量为非法值,避免未初始化的随机值干扰校验
    int input = -1, input2 = -1, output;
    printf("ENTER INPUT AS 1 OR 0 (1 AS TRUE AND 0 AS FALSE)");
    
    printf("\nEnter your first input:");
    while (scanf("%d", &input) != 1 || (input != 0 && input != 1))
    {
        clear_input_buffer(); // 先清空残留的非法输入
        printf("Please enter a valid input:");
    }
    
    printf("Enter your second input:");
    while (scanf("%d", &input2) != 1 || (input2 != 0 && input2 != 1))
    {
        clear_input_buffer();
        printf("Please enter a valid input:");
    }
    
    output = input & input2;
    printf("\n\nThe truth table of AND gate with given input is shown below\n\n");
    printf("\t\tTruth Table");
    printf("\n\nINPUT\t\tINPUT2\t\tOUTPUT");
    printf("\n%d\t\t%d\t\t%d", input, input2, output);
    _getch();
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:18:03