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

数组输入验证问题:负数输入后无法重新输入当前元素

输入验证问题修复

你的代码核心问题是:当输入负数时,没有阻止循环计数器count递增,导致直接跳转到下一个月份的输入;同时外层的do-while循环逻辑完全错误——循环结束后count的值等于NUM_MONTHS,访问consumption[count]会触发数组越界。

正确的做法是为每个月份的输入单独做循环验证,直到用户输入合法的非负数为止。修改后的代码如下:

#include <iostream>
#include <string>
#include <limits>

using namespace std;

#define NUM_MONTHS 11 // 注意原数组缺少"May",此处保持与原定义一致

int main() {
    string months[NUM_MONTHS] = {"January", "February", "March", "April", "June", "July", "August", "September", "October", "November", "December"};
    int consumption[NUM_MONTHS]; // 存储每月消耗量的数组
    int count; // 循环计数器

    for (count = 0; count < NUM_MONTHS; count++)
    {
        // 对当前月份的输入循环验证,直到合法
        do
        {
            cout << "Enter the CCF consumed for " << months[count] << ": ";
            cin >> consumption[count];

            // 输入负数时提示错误
            if (consumption[count] < 0)
            {
                cout << "Error: Consumption cannot be a negative integer!" << endl;
            }

            // 处理非整数输入的情况(可选但推荐)
            if (cin.fail())
            {
                cout << "Error: Please enter a valid integer!" << endl;
                cin.clear(); // 清除输入错误状态
                cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 清空输入缓冲区残留内容
                consumption[count] = -1; // 强制进入下一轮循环
            }
        } while (consumption[count] < 0);
    }

    // 此处可添加后续数据处理逻辑
    return 0;
}

关键改动说明

  • 将验证逻辑移至每个月份的输入内部,确保输入不合法时停留在当前月份重新输入,不会跳转到下一个。
  • 新增非整数输入的处理逻辑,避免用户输入字母等非法内容导致程序死循环。
  • 移除原外层无效的do-while循环,彻底消除数组越界风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 17:12:14