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

C++如何实现输入校验,确保输入为0-100整数、禁止输入字符

代码问题排查与修复方案

原有代码核心问题

  • 输入校验逻辑完全错误:使用cin >> 整型变量时,如果用户输入非数字内容,cin会直接触发失败状态,后续读取的整型变量都会是未定义的垃圾值。你后续将int类型的成绩值转成char调用isdigit的逻辑没有任何意义:isdigit的作用是判断单个字符的ASCII码是否属于'0''9'(对应ASCII值4857),比如你输入合法成绩70,grade1的值为70,对应的ASCII字符是'F',isdigit(70)会返回0,反而会把合法输入判定为非法。
  • 没有处理输入失败后的状态复位和缓冲区清理,一旦输入错误程序后续逻辑会全部异常。
  • 缺少0~100的数值范围判断,也没有处理平均值计算的整数除法误差问题。

正确实现逻辑

  1. 逐次输入单个成绩,每次输入后首先检查cin.fail()判断是否输入了非数字内容,如果触发失败则提示错误,清空cin错误标志,清空输入缓冲区所有剩余内容后退出程序。
  2. 输入成功后判断成绩是否在0~100闭区间内,不符合则提示输入范围错误。
  3. 计算平均值时先将总成绩转成浮点型再做除法,避免整数除法的截断误差。

完整可运行示例代码

#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

相关产品推荐
方舟 Agent Plan

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

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