C语言实现输入正确前循环询问 修复scanf非整数输入无限循环问题
无限循环的根本原因
scanf("%d", &input)匹配失败时不会消耗输入缓冲区内容:当用户输入字母等非整数内容时,scanf无法匹配%d的格式要求,会直接返回0,既不会修改input变量的值,也不会把缓冲区里的非法内容读走。- 残留的非法内容会一直留在缓冲区,下一次循环执行
scanf时还是会读取到同一段无效内容,反复匹配失败就形成了无限循环。 - 额外逻辑缺陷:你现有代码会先执行
primes函数再判断返回值,就算输入的是小于1的无效整数,也会先跑一遍无意义的primes函数逻辑,存在多余开销。
最优修复方案
核心改造点
- 优先判断
scanf的返回值,确认是否成功匹配到整数 - 匹配失败时主动清空输入缓冲区的残留内容
- 先完成输入合法性校验,再执行质数计算逻辑
修复后完整代码
#include <stdio.h> int primes(int input); int main(void) { int input; int scanf_ret; while (1) { printf("How many n first primes do you want to display? "); scanf_ret = scanf("%d", &input); // 输入匹配成功且值合法,跳出循环执行质数输出 if (scanf_ret == 1 && input >= 1) { break; } // 匹配失败时清空整个输入缓冲区的残留内容 if (scanf_ret != 1) { while(getchar() != '\n'); } printf("输入不合法,请输入大于等于1的整数\n"); } primes(input); return 0; } int primes(int input) { int count1 = 0, count2 = 0, b = 1, n = 2; while (count1 < input) { b = 1; count2 = 0; while (b <= n) { if (n%b == 0) { count2++; } b++; } if(count2 == 2) { printf("%d\n",n); count1++; } n++; } return 1; }
方案说明
- 用死循环做输入校验,仅当输入符合要求时才跳出,避免重复编写输入提示和
scanf代码 - 用
while(getchar() != '\n')读走缓冲区中直到换行符的所有无效内容,保证下一次scanf可以读取到用户新输入的内容 - 先校验输入合法性再执行质数计算,完全避免无效的函数执行开销
内容的提问来源于stack exchange,提问作者D-I-S-C
相关产品推荐
相关产品推荐

