数组输入验证问题:负数输入后无法重新输入当前元素
输入验证问题修复
你的代码核心问题是:当输入负数时,没有阻止循环计数器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
相关产品推荐
相关产品推荐

