输入非数字(如字符'q')时程序陷入无限循环的原因是什么?
为什么输入字符'q'时这个C语言程序会陷入无限循环?
这问题踩中了C语言输入处理里两个很容易忽略的坑,咱们一步步拆解:
1. 输入缓冲区的残留字符让scanf反复“卡壳”
你用scanf(" %d", &grade)来读取整数,但%d格式符只认十进制数字。当你输入q这种非数字字符时,scanf完全不知道怎么处理它——匹配失败,这个q会原封不动留在输入缓冲区里。
接下来的每一轮循环,scanf都会再次去缓冲区里找整数,结果还是碰到那个顽固的q,匹配再次失败。相当于每次循环都在做无用功,永远读不到有效输入。
2. 未初始化的grade变量让循环停不下来
你声明了int grade;但没给它赋初始值,C语言里局部变量的初始值是随机的(未定义行为)。如果这个随机值刚好落在0-10之间(比如是3或者7),那麻烦就来了:
每次scanf失败后,grade的值不会被修改,还是那个随机的有效分数。程序会进入Pass或Fail分支,根本碰不到default分支里的flag = false——flag一直是true,循环自然就无限跑下去了。
怎么修复?
给你两个关键的修复点:
- 初始化
grade:比如把它初始化成一个无效值,int grade = -1;,这样就算scanf第一次失败,也会进入default分支终止循环。 - 处理输入错误并清空缓冲区:检查
scanf的返回值(它会返回成功读取的变量个数,读整数成功时返回1),如果返回值不是1,说明输入错误,用while(getchar() != '\n');把缓冲区里的垃圾字符全清掉,避免下次循环再踩坑。
修复后的代码示例:
#include <stdio.h> #include <stdbool.h> int main(void) { int grade = -1; // 初始化无效值 bool flag = true; while (flag) { puts("-----------------------------"); printf("What's your grade out of 10? "); int ret = scanf(" %d", &grade); // 处理输入错误 if (ret != 1) { printf("Illegal Grade\n"); // 清空缓冲区直到换行 while(getchar() != '\n'); flag = false; continue; } switch (grade) { case 10: case 9: case 8: case 7: case 6: printf("Pass\n"); break; case 5: case 4: case 3: case 2: case 1: case 0: printf("Fail\n"); break; default: printf("Illegal Grade\n"); flag = false; break; } } return 0; }
内容的提问来源于stack exchange,提问作者Ab Be
相关产品推荐
相关产品推荐

