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

C语言实现输入正确前循环询问 修复scanf非整数输入无限循环问题

无限循环的根本原因

  • scanf("%d", &input)匹配失败时不会消耗输入缓冲区内容:当用户输入字母等非整数内容时,scanf无法匹配%d的格式要求,会直接返回0,既不会修改input变量的值,也不会把缓冲区里的非法内容读走。
  • 残留的非法内容会一直留在缓冲区,下一次循环执行scanf时还是会读取到同一段无效内容,反复匹配失败就形成了无限循环。
  • 额外逻辑缺陷:你现有代码会先执行primes函数再判断返回值,就算输入的是小于1的无效整数,也会先跑一遍无意义的primes函数逻辑,存在多余开销。

最优修复方案

核心改造点

  1. 优先判断scanf的返回值,确认是否成功匹配到整数
  2. 匹配失败时主动清空输入缓冲区的残留内容
  3. 先完成输入合法性校验,再执行质数计算逻辑

修复后完整代码

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:39:03