void函数内循环控制异常:输入验证无限循环及未初始化问题求助
修正C++ getDay()函数的输入校验循环问题
原始代码
void getDay() { bool repeat; do { cout << "Enter the day code (first 2 letters): "; cin >> weekDay1; cin >> weekDay2; weekDay1 = toupper(weekDay1); weekDay2 = toupper(weekDay2); switch (weekDay1) { case 'M': break; case 'T': break; case 'W': break; case 'F': break; case 'S': break; default: cout << "Invalid input. Please try again.\n"; repeat = true; break; } switch (weekDay2) { case 'O': break; case 'U': break; case 'E': break; case 'H': break; case 'R': break; case 'A': break; default: cout << "Invalid input. Please try again.\n"; repeat = true; break; } }while (repeat == true); return; }
问题分析
- 未初始化变量:
bool repeat未赋值就参与循环判断,触发运行时未定义行为 - 无限循环:仅在输入非法时设置
repeat = true,但合法输入时未将repeat重置为false,一旦进入循环无法退出
修正后的代码
#include <iostream> #include <cctype> using namespace std; char weekDay1, weekDay2; // 假设变量已在其他地方声明,此处为编译兼容补充 void getDay() { bool repeat = false; // 初始化循环控制变量 do { repeat = false; // 每次循环开始重置状态 cout << "Enter the day code (first 2 letters): "; cin >> weekDay1; cin >> weekDay2; weekDay1 = toupper(weekDay1); weekDay2 = toupper(weekDay2); bool isFirstValid = true; // 校验第一个字符 switch (weekDay1) { case 'M': case 'T': case 'W': case 'F': case 'S': break; default: cout << "Invalid first character. Please try again.\n"; isFirstValid = false; repeat = true; break; } // 第一个字符合法时才校验第二个字符 if (isFirstValid) { switch (weekDay2) { case 'O': // 对应Mon case 'U': // 对应Tue、Sun case 'E': // 对应Wed、Thu case 'H': // 对应Thu case 'R': // 对应Fri case 'A': // 对应Sat break; default: cout << "Invalid second character. Please try again.\n"; repeat = true; break; } } } while (repeat); // 简化循环条件判断 return; }
关键修改说明
- 初始化repeat:声明时直接赋值
false,消除未初始化导致的运行风险 - 循环前置重置:每次进入do块时将
repeat设为false,确保只有输入非法时才触发下一次循环 - 分阶段校验:用
isFirstValid标记第一个字符的合法性,非法时跳过第二个字符校验,优化用户体验 - 精准错误提示:分别提示首字符/次字符非法,帮助用户快速定位问题
- 简化条件写法:
while (repeat)等价于while (repeat == true),更符合C++编码规范
内容的提问来源于stack exchange,提问作者Ethan Gray
相关产品推荐
相关产品推荐

