如何在do/while循环中正确验证用户输入的AM/PM时段字符串?
问题解决:AM/PM输入验证循环失效的修复
问题根源
你用错了逻辑运算符:||(逻辑或)会导致循环条件永远为真。
- 输入"AM"时,
departure_amOrPM != "am"为真,整个while条件true || false结果为真,循环继续 - 输入"am"时,
departure_amOrPM != "AM"为真,整个while条件false || true结果仍为真,循环继续
要实现「输入不是AM也不是am时继续循环」的逻辑,应该用&&(逻辑与)——只有当两个条件同时成立(既不是AM,也不是am),才继续循环。
修正后的基础代码
do { cout << "Please Enter a Valid Period: "; cin >> departure_amOrPM; } while (departure_amOrPM != "AM" && departure_amOrPM != "am");
扩展到支持PM/pm的写法
如果要同时验证AM/am和PM/pm,只需在条件中补充对应判断:
do { cout << "Please Enter a Valid Period: "; cin >> departure_amOrPM; } while (departure_amOrPM != "AM" && departure_amOrPM != "am" && departure_amOrPM != "PM" && departure_amOrPM != "pm");
更优雅的写法(统一大小写判断)
可以把输入统一转为小写(或大写)后再判断,减少重复条件:
#include <algorithm> #include <string> // ... do { cout << "Please Enter a Valid Period: "; cin >> departure_amOrPM; // 将输入字符串转为全小写 std::transform(departure_amOrPM.begin(), departure_amOrPM.end(), departure_amOrPM.begin(), [](unsigned char c){ return std::tolower(c); }); } while (departure_amOrPM != "am" && departure_amOrPM != "pm");
内容的提问来源于stack exchange,提问作者Josh Dazey
相关产品推荐
相关产品推荐

