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; }
关键修改说明
- 初始化变量:给
choose和manage1设置初始值0,避免随机值导致循环逻辑异常。 - 子菜单前重置choose:每次进入子菜单前将
choose设为0,确保while(choose !=12)条件成立,能正常进入子菜单循环。 - 补充case4的break:防止执行完case4后直接跳到case9退出程序。
- 处理scanf输入失败:检查scanf的返回值,若读取失败(输入非数字),清空输入缓冲区的错误字符,避免后续scanf持续失败导致菜单无限重复。
内容的提问来源于stack exchange,提问作者trimai_
相关产品推荐
相关产品推荐

