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
相关产品推荐
相关产品推荐

