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

如何用fputs实现非整数输入时循环提示重输而非终止程序

考核结果统计程序修改:实现非整数输入时循环重试需求

原代码存在多处关键问题,无法满足输入错误时循环重试的需求,以下是修改后的完整代码及核心说明:

修改后的代码

#include <stdio.h>
#include <ctype.h>

int main(void) {
    int test_result;
    int pass = 0;
    int fail = 0;
    int invalid = 0;

    for (int trainee_total = 0; trainee_total < 6; trainee_total++) {
        printf("Enter Result (Pass=1 Fail=2) :");

        // 循环读取直到获取有效整数输入
        while (scanf("%d", &test_result) != 1) {
            fputs("Wrong input! Please enter an integer (1 for pass, 2 for fail).\n", stderr);
            
            // 清空输入缓冲区的无效字符,避免后续scanf重复读取错误数据
            int c;
            while ((c = getchar()) != '\n' && c != EOF) {
                // 跳过所有非换行的无效字符
            }
        }

        // 判断输入值是否符合要求
        if (test_result == 1) {
            pass++;
        } else if (test_result == 2) {
            fail++;
        } else {
            invalid++;
            fputs("Invalid value! Please enter 1 or 2.\n", stderr);
        }
    }

    printf("The number of participants that passed is :  %d\n", pass);
    printf("The number of participants that failed is :  %d\n", fail);
    printf("Invalid input is :  %d\n", invalid);

    return 0;
}

核心修改点

  • 初始化计数变量:将pass、fail、invalid初始化为0,避免使用未定义的内存值导致统计结果混乱
  • 修复循环初始化:给for循环的trainee_total设初始值0,确保循环稳定执行6次
  • 循环处理输入错误:把原有的单次scanf判断改为while循环,当读取非整数失败时,不终止程序,而是持续提示并等待正确输入
  • 清理输入缓冲区:当scanf读取失败后,用getchar()逐个清空缓冲区的无效字符直到换行,避免后续scanf一直读取错误数据陷入死循环
  • 区分错误类型:分别处理「非整数输入」和「整数但不在1/2范围内」的情况,给出更明确的错误提示
  • 移除终止程序的return:删除原代码中输入错误时的return 1,保证程序持续运行直到获取正确输入

内容的提问来源于stack exchange,提问作者Cadefr6554

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:03:35