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

C++ switch-case结合while循环实现菜单无效输入后跳转异常问题

问题根因
  • default分支逻辑缺失:你在switch的default块中仅循环读取用户重新输入的合法值,但拿到合法选项后没有执行对应功能的跳转逻辑,default块执行完就直接退出menu()函数,回到main函数的死循环中,自然会重新打印主菜单。
  • 菜单跳转存在递归调用风险:当前二级功能菜单选择“返回主菜单”时直接递归调用menu()函数,多次跳转后会出现栈溢出问题,不属于规范的菜单返回实现。
  • 冗余全局变量错误:全局作用域下定义的booktitle/author/datepublished为int类型,和后续业务逻辑中需要的string类型冲突,且和函数内局部变量重名,属于无效冗余定义。
  • 命名冲突风险:自定义的退出函数和标准库stdlib.h内置的exit()函数重名,会引发编译或运行异常。
修复方法
  • 调整主菜单输入校验逻辑:把输入合法性校验前置,先循环读取到合法的选项值,再进入switch分支做功能跳转,确保第一次输入、重输入的合法值都能直接命中对应功能逻辑,不会重复打印主菜单。
  • 替换递归返回逻辑:所有二级菜单中“返回主菜单”的逻辑不要直接调用menu(),改为直接return让函数自然返回上层调用栈,避免栈溢出。
  • 补全退出逻辑:重命名自定义退出函数避免和标准库冲突,函数内将全局标记位e设为1,确保程序可以正常退出,同时删除冗余的错误全局变量定义。

修复后的核心代码实现
#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;
// 仅保留需要的全局变量
int choice;
int e = 0;

void menu();
void inputbook();
void searchbook();
void borrowbook();
void exitProgram(); // 避免和stdlib.h的exit函数重名

// 图书类
class Books
{
public:
    int booknumber;
    string booktitle;
    string author;
    string datepublished;
    Books(const int booknumber, const string booktitle, const string author, const string datepublished) : booknumber(booknumber), booktitle(booktitle), author(author), datepublished(datepublished) {}
};

// 主函数
int main()
{
    while (true)
    {
        cout << endl;
        if (e == 1)
        {
            break;
        }
        menu();
    }
    return 0;
}

// 修复后的主菜单函数
void menu()
{
    cout << "Welcome to DLC Library System\n";
    cout << "Final Project in Advance Programming\n\n";

    cout << "PROGRAMMER\n";
    cout << "ME\n\n";

    cout << "====================================\n";
    cout << "[1] -------- Input Book ------------\n";
    cout << "[2] -------- Search Book -----------\n";
    cout << "[3] -------- Borrow Book -----------\n";
    cout << "[4] -------- Exit Program ----------\n";
    cout << "====================================\n";
    cout << "Input your choice (Number Only): ";
    cin >> choice;

    // 前置校验输入合法性,直到拿到合法选项
    while (choice < 1 || choice > 4)
    {
        cout << "Wrong Option\n";
        cout << "Input your choice (Number Only): ";
        cin >> choice;
    }

    // 合法选项直接走分支跳转
    switch (choice)
    {
    case 1:
        inputbook();
        break;
    case 2:
        searchbook();
        break;
    case 3:
        borrowbook();
        break;
    case 4:
        exitProgram();
        break;
    }
}

// 退出函数实现
void exitProgram()
{
    e = 1;
}

// 修复后的录入图书函数
void inputbook()
{
    int booknumber;
    string booktitle;
    string author;
    string datepublished;

    cout << "INPUT NEW BOOK\n\n";

    cout << "Book Number: \n";
    cin >> booknumber;

    cout << "Book Title: \n";
    cin >> booktitle;

    cout << "Author: \n";
    cin >> author;

    cout << "Date Publish: \n";
    cin >> datepublished;
    Books(booknumber, booktitle, author, datepublished);

    cout << "====================================\n";
    cout << "[1] -------- Try Again? ------------\n";
    cout << "[2] -------- Return to Menu --------\n";
    cout << "[3] -------- Exit Program ----------\n";
    cout << "====================================\n";
    cout << "Input your choice (Number Only): ";
    cin >> choice;

    switch (choice)
    {
    case 1:
        inputbook();
        break;
    case 2:
        // 直接返回,不要递归调用menu
        return;
    case 3:
        exitProgram();
        return;
    default:
        cout << "Wrong Option";
        // 输错直接返回主菜单即可,也可以按需加循环重输逻辑
        return;
    }
}

// 其余searchbook、borrowbook函数参考inputbook的逻辑修改返回即可
void searchbook() {
    // 填充原有业务逻辑
    return;
}
void borrowbook() {
    // 填充原有业务逻辑
    return;
}

补充提示:如果需要支持带空格的图书名、作者名输入,不要用cin >>读字符串,换成getline(cin, 变量名),同时注意处理前面cin遗留的换行符避免读空。


内容的提问来源于stack exchange,提问作者grahamx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:24:25