read_boolean函数未正确比较输入,请问代码存在哪些问题?
咱们一步一步拆解你代码里的问题,这些就是导致输入比较失效的核心原因:
逻辑判断的致命错误
你写的if (result == "yes" or "y")完全不是你想的那样。在C++里,or(等价于||)两边是独立的布尔表达式,"y"是一个非空字符串常量,它在布尔语境下会被视为true。所以这个条件等价于(result == "yes") || true——不管result是什么内容,这个条件永远为真!同理else if (result == "no" or "n")也是一样的逻辑错误,而且因为第一个条件永远成立,这个分支根本不会被执行到。正确的写法应该是分别判断两个相等条件:
if (result == "yes" || result == "y")未实际调用小写转换函数
你在函数内部声明了string to_lowercase(const string &text);,但从来没调用它!也就是说,用户输入"Yes"、"Y"、"NO"这种大小写混合的内容时,根本不会被转换为小写,自然匹配不上全小写的"yes"或"no"。你应该把输入的result先转成小写再判断,比如:result = to_lowercase(result);另外,函数声明放在函数内部是不符合C++规范的,应该把
to_lowercase的声明移到read_boolean函数外面,或者对应的头文件里。返回值逻辑错误
你的函数声明是返回bool类型,但最后固定return 0;(也就是false),完全没有根据用户的输入返回对应的布尔值。比如用户输入"yes"/"y"时应该返回true,输入"no"/"n"时返回false,现在不管什么情况都返回false,这显然不符合函数的设计意图。未处理无效输入
如果用户输入的既不是yes/y也不是no/n,你的代码没有任何处理,直接返回0,也没有给用户提示输入无效,这会让调用方摸不着头脑。可以加一个else分支来处理这种情况,比如提示用户输入无效,或者返回一个默认值、重新读取输入。
修正后的示例代码大概是这样的:
// 先把to_lowercase的声明放在函数外部 string to_lowercase(const string &text); bool read_boolean(string prompt) { string result = read_string(prompt); // 调用小写转换统一格式 result = to_lowercase(result); if (result == "yes" || result == "y") { write_line("Value is updated"); return true; // 返回对应的true } else if (result == "no" || result == "n") { write_line("false"); return false; // 返回对应的false } else { write_line("Invalid input, please enter yes/no or y/n"); // 这里可以选择重新读取输入,或者返回默认值,示例返回false return false; } }
内容的提问来源于stack exchange,提问作者Param Dhillon

