C++入住验证代码中switch语句未等待输入直接触发默认分支的问题求助
Hey Emma, let's break down what's going wrong with your code step by step—there are a few small issues adding up to that weird behavior you're seeing!
1. 布尔类型误用导致输入流异常
你把houseID和ID都定义成了bool类型,但bool只能存储true(非0)或false(0),根本存不住151这种整数。当你用cin >> ID输入151时,cin无法把这个值解析成有效的布尔值,会直接触发输入失败状态,后续所有的cin操作(比如读取checkC)都会被跳过。这就导致checkC是一个未初始化的垃圾值,switch自然会直接跳到default分支,连输入机会都不给你。
解决办法:把houseID和ID改成int类型,这样就能正常存储和读取151这种数值了。
2. 赋值操作代替了比较操作
你的if (ID = houseID)是赋值语句,不是比较!这里会把houseID的值赋给ID,然后判断这个值是否为真——因为houseID是151(非0,转成bool是true),所以不管你输入什么,这个条件都会成立。应该改成if (ID == houseID)用双等号做比较。
3. Switch分支的字符常量错误
你写的case '144794221':是多字符字符常量,这属于C++里的未定义行为,而且checkC是int类型,你要匹配的是数字144794221,所以应该去掉单引号,写成case 144794221:。另外,你定义的bool code = 144794221;完全没用,可以删掉——因为code是bool类型,144794221会被转成true,根本存不住原数值。
修正后的代码示例
#include <iostream> void idcheck(); int main(){ int houseID = 151; // 改成int类型 int ID; // 改成int类型 int house1 = 1; int house2 = 2; int house3 = 3; std::cout << "*****Welcome to miniclean property managers*****\n"; std::cout << "Please enter your airBnB's address: "; std::cin >> ID; if (ID == houseID) // 双等号做比较 { idcheck(); } return 0; } void idcheck(){ int checkC; // 删掉没用的bool code变量 std::cout << "Please enter code: "; std::cin >> checkC; switch (checkC) { case 144794221: // 去掉单引号,用数字常量 std::cout << "Thankyou, your house code is 8868. Enjoy your stay!"; break; default: std::cout << "Incorrect code, please try again"; break; } }
另外,建议你以后调试的时候可以加一些输出,比如在cin >> ID之后输出ID的值,看看是不是读取正确了,这样能更快定位问题~
备注:内容来源于stack exchange,提问作者Emma Robb-collins

