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

C语言嵌套菜单循环异常求助:返回后无法重新选择功能

嵌套菜单返回后无法选择功能的问题修复

核心问题分析

你的代码存在几个关键错误,导致从子菜单返回主菜单后出现异常:

  • 变量未初始化:choose和manage1都是局部变量,未初始化就用于循环条件判断,初始值为随机垃圾值,可能导致循环逻辑混乱。
  • 子菜单返回后未重置choose:从子菜单选择12返回后,choose的值保持为12,再次进入子菜单时,while(choose != 12)的条件直接不成立,无法进入子菜单。
  • case 4代码块遗漏break:执行完case 4的子菜单后,没有break语句,会直接执行后续的case 9代码,导致程序直接退出,而非回到主菜单。
  • scanf未处理输入错误:若输入非数字字符,scanf会读取失败,错误字符留在输入缓冲区,导致后续scanf持续失败,菜单无限重复打印。

修复后的代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 初始化变量,避免随机值干扰
    int choose = 0;
    int manage1 = 0;

    while(manage1 != 9) {
        printf("Choose which program you want to use!\n");
        printf("1.Students in a class\n");
        printf("2.Motorbikes in a shop\n");
        printf("3.Book in a library\n");
        printf("4.Drugs in a store\n");
        printf("5.Equipment in a laboratory\n");
        printf("6.Food in a mini market\n");
        printf("7.Fruit in a fruit shop\n");
        printf("8.Items in sport shop\n");
        printf("9.Out!\n");
        
        // 处理scanf输入失败的情况,清空缓冲区
        if(scanf(" %d", &manage1) != 1) {
            printf("输入错误,请输入数字!\n");
            // 清空输入缓冲区的错误字符
            while(getchar() != '\n');
            continue;
        }

        switch (manage1) {
            case 3:
                // 进入子菜单前重置choose的值
                choose = 0;
                while (choose != 12) {
                    printf("1.Display\n");
                    printf("2.add new object\n");
                    printf("3.Sort by name\n");
                    printf("4.Sort by quanity\n");
                    printf("5.Sort by year\n");
                    printf("6.Searching for a book name\n");
                    printf("7.Searching for a book code\n");
                    printf("8.Delete by a book name\n");
                    printf("9.Delete by a book code\n");
                    printf("10.Delete all\n");
                    printf("11.Export infomation into a file\n");
                    printf("12.Return!\n");
                    
                    if(scanf("%d", &choose) != 1) {
                        printf("输入错误,请输入数字!\n");
                        while(getchar() != '\n');
                        continue;
                    }

                    switch (choose) {
                        case 1:
                            //Do something
                            break;
                        case 12:
                            printf("Exit!\n");
                            break;
                        default:
                            printf("Wrong syntax\n");
                            break;
                    }
                }
                break;
            case 4:
                // 进入子菜单前重置choose的值
                choose = 0;
                while (choose != 12) {
                    printf("1.Display\n");
                    printf("2.add new object\n");
                    printf("3.Sort by name\n");
                    printf("4.Sort by quanity\n");
                    printf("5.Sort by year\n");
                    printf("6.Searching for a book name\n");
                    printf("7.Searching for a book code\n");
                    printf("8.Delete by a book name\n");
                    printf("9.Delete by a book code\n");
                    printf("10.Delete all\n");
                    printf("11.Export infomation into a file\n");
                    printf("12.Return!\n");
                    
                    if(scanf("%d", &choose) != 1) {
                        printf("输入错误,请输入数字!\n");
                        while(getchar() != '\n');
                        continue;
                    }

                    switch (choose) {
                        case 1:
                            //Do something
                            break;
                        case 12:
                            printf("Exit!\n");
                            break;
                        default:
                            printf("Wrong syntax\n");
                            break;
                    }
                }
                // 添加break,避免执行后续case
                break;
            case 9:
                printf("Exit the program!");
                break;
            default:
                printf("Wrong syntax\n");
                break;
        }
    }
    return 0;
}

关键修改说明

  1. 初始化变量:给choose和manage1设置初始值0,避免随机值导致循环逻辑异常。
  2. 子菜单前重置choose:每次进入子菜单前将choose设为0,确保while(choose !=12)条件成立,能正常进入子菜单循环。
  3. 补充case4的break:防止执行完case4后直接跳到case9退出程序。
  4. 处理scanf输入失败:检查scanf的返回值,若读取失败(输入非数字),清空输入缓冲区的错误字符,避免后续scanf持续失败导致菜单无限重复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:04:50