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

C语言循环输入非法值后无法回退重新输入的问题求助

解决C语言成绩输入程序的非法值重新输入问题

先梳理你代码里的核心问题,这些问题直接导致非法输入时无法回退重新输入:

  • 数组定义错误:const int score[5]; 是只读数组无法存储输入值,且数组大小为5却要存6个成绩,会触发数组越界
  • 判断逻辑完全错误:if (score > 0 , score > 51); 的逗号表达式逻辑无效,且末尾的分号让后续提示语句不受条件控制
  • 没有处理非法输入的重试逻辑,也未清理输入缓冲区的无效数据,容易引发死循环

下面是修正后的代码,完美实现非法输入时回退重新输入的功能:

#include <stdio.h>

int main() {
    int percent;
    int totalscore = 0;
    // 定义可存储6个成绩的数组,索引采用0-5避免越界
    int score[6];

    for (int grades = 0; grades < 6; grades++) {
        int input_valid;
        do {
            printf("please enter the grade for assignment #%d: ", grades + 1);
            // 检查scanf返回值,确保输入是有效整数
            input_valid = scanf("%d", &score[grades]);
            
            // 清理输入缓冲区的无效数据(比如输入字母、符号的情况)
            if (!input_valid) {
                while (getchar() != '\n');
            }

            // 判断成绩是否在1-50的合法范围内
            if (input_valid && score[grades] >= 1 && score[grades] <= 50) {
                totalscore += score[grades];
                break; // 输入有效,退出当前重试循环
            } else {
                printf("Please enter a number between 1 and 50.\n");
            }
        } while (1); // 持续循环直到输入有效
    }

    printf("Over 6 assignments you earned %d points out of a possible 300 points!\n", totalscore);
    // 调整百分比计算方式,避免整数除法的精度丢失
    percent = (totalscore * 100) / 300;
    printf("Your grade is %d percent.\n", percent);

    return 0;
}

关键修改说明:

  • 将数组改为可读写的int score[6],用0-5的索引规避越界问题
  • 用do-while循环包裹输入逻辑,强制程序在输入合法前持续重试当前项,不会跳转到下一个输入
  • 增加scanf返回值检查,配合输入缓冲区清理,避免无效输入导致的死循环
  • 修正成绩范围判断条件,确保只有1-50的值被认定为有效输入
  • 调整百分比计算逻辑,用(totalscore * 100) / 300减少整数除法带来的精度损失

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:22:20