C++如何实现输入校验,确保输入为0-100整数、禁止输入字符
代码问题排查与修复方案
原有代码核心问题
- 输入校验逻辑完全错误:使用
cin >> 整型变量时,如果用户输入非数字内容,cin会直接触发失败状态,后续读取的整型变量都会是未定义的垃圾值。你后续将int类型的成绩值转成char调用isdigit的逻辑没有任何意义:isdigit的作用是判断单个字符的ASCII码是否属于'0''9'(对应ASCII值4857),比如你输入合法成绩70,grade1的值为70,对应的ASCII字符是'F',isdigit(70)会返回0,反而会把合法输入判定为非法。 - 没有处理输入失败后的状态复位和缓冲区清理,一旦输入错误程序后续逻辑会全部异常。
- 缺少0~100的数值范围判断,也没有处理平均值计算的整数除法误差问题。
正确实现逻辑
- 逐次输入单个成绩,每次输入后首先检查
cin.fail()判断是否输入了非数字内容,如果触发失败则提示错误,清空cin错误标志,清空输入缓冲区所有剩余内容后退出程序。 - 输入成功后判断成绩是否在0~100闭区间内,不符合则提示输入范围错误。
- 计算平均值时先将总成绩转成浮点型再做除法,避免整数除法的截断误差。
完整可运行示例代码
#include <iostream> #include <limits> using namespace std; int main() { int grades[4]; float average; cout << "Enter 4 integer grades (%): "; // 逐次输入四个成绩 for (int i = 0; i < 4; i++) { cin >> grades[i]; // 校验是否输入了非数字 if (cin.fail()) { cout << "Incorrect input - characters not allowed; Please run the program again and enter proper values" << endl; // 清空错误标志 cin.clear(); // 清空输入缓冲区剩余所有内容 cin.ignore(numeric_limits<streamsize>::max(), '\n'); return 1; } // 校验数值范围 if (grades[i] < 0 || grades[i] > 100) { cout << "Incorrect input - grade must be between 0 and 100; Please run the program again and enter proper values" << endl; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); return 1; } } // 计算平均值,先转成float避免整数除法 average = (float)(grades[0] + grades[1] + grades[2] + grades[3]) / 4; // 按要求输出 cout << "Your grades were: " << grades[0] << " " << grades[1] << " " << grades[2] << " " << grades[3] << endl; cout << "Your average grade is " << average << endl; return 0; }
内容的提问来源于stack exchange,提问作者Mysterai
相关产品推荐
相关产品推荐

