C++ switch语句与函数实现图书管理功能出现输入匹配错误
问题根因
你遇到的选书后始终显示Python Programming的问题,是C++ switch 语句的典型基础语法错误:switch的case分支如果不手动加break终止执行,会触发fall-through(分支贯穿):程序匹配到对应case后,会顺着往下执行后续所有case的代码,直到碰到break或者整个switch块结束才会停下。
具体有两处核心疏漏:
- 选书逻辑的内层
switch所有case分支都没加break:比如选编号1的《Computer Science》,程序调用book1()给全局变量book赋值后不会跳出分支,会顺序执行case2的book2()把值改成《Programming with C++》,再继续执行case3的book3()把值改成《Python Programming》,最后碰到default的break才停下,所以无论选哪本书,最终book变量都会被覆盖成Python Programming。 - 外层主菜单的
switch中,case2(归还图书)、case3(查看已借图书)分支末尾也没加break,会出现选归还图书后直接贯穿执行查看图书分支逻辑的问题,流程不符合预期。
修正后可运行代码
#include <iostream> #include <string> // 原代码漏加string头文件,部分编译器会隐式引入但不符合规范 using namespace std; string book; void menu(){ cout << "*********Menu*********"; cout << "\n1) Sign out book"; cout << "\n2) sign in book"; cout << "\n3) See my books"; cout << "\n4) Exit"; } void book1(){ book = "Computer Science"; } void book2(){ book = "Programming with C++"; } void book3(){ book = "Python Programming"; } int main(){ //Vars int choice; do { menu(); cin >> choice; switch (choice) { case 1: int book_choice; cout << "\n**********************"; cout << "\n1) Computer Science"; cout << "\n2) Programming with C++"; cout << "\n3) Python Programming"; cin >> book_choice; switch (book_choice) { case 1: book1(); break; // 补充分支终止逻辑 case 2: book2(); break; // 补充分支终止逻辑 case 3: book3(); break; // 补充分支终止逻辑 default: cout << "\nInvalid book choice!"; break; } break; case 2: cout << "\n**********************"; cout << "\nSigned out books: "; cout << book; break; // 补充分支终止,避免贯穿到case3 case 3: cout << "\n**********************"; cout << "\nYour borrowed book: " << book; break; // 补充分支终止 case 4: cout << "\nExit program"; break; default: cout << "\nInvalid menu choice!"; break; } } while (choice != 4); }
额外优化提示
- 原代码未引入
<string>头文件:使用std::string类型必须显式引入该头文件,部分编译器会通过<iostream>隐式带入相关声明,但属于不规范写法,跨编译器编译可能触发报错。 - 当前仅用单个全局字符串变量存储一本已借图书,扩展性极差,如果需要支持多本图书借阅、归还的场景,建议改用数组或者
vector<string>类型存储已借图书列表。
内容的提问来源于stack exchange,提问作者zack
相关产品推荐
相关产品推荐

