You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:03:27