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
相关产品推荐
相关产品推荐

