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

