C语言菜单程序陷入循环,持续输出‘Invalid Choice’问题求助
解决C语言菜单程序持续输出"Invalid Choice"的死循环问题
你遇到的死循环核心问题出在scanf("%d", &choice)的输入处理逻辑上,同时代码还存在几个编译级别的问题,逐一拆解:
问题根源
- 输入不匹配导致的缓冲区残留:
当你输入非整数(比如字母、符号、空格)时,scanf("%d")会匹配失败,此时choice的取值不会被更新(如果没初始化就是随机垃圾值),而且这些不匹配的字符会留在输入缓冲区里。下一次循环时,scanf会直接读取缓冲区里的垃圾字符,再次匹配失败,choice始终不符合任何case分支,持续触发default输出提示,陷入死循环。 - 未声明变量:代码里的
size、arr、val都没有提前声明,会直接导致编译失败,必须先补全。
修复方案
1. 检查scanf返回值,清空输入缓冲区
每次调用scanf后,判断返回值是否为1(成功读取一个整数),如果不是,就用循环把输入缓冲区里的所有字符读走,直到遇到换行符,彻底清除残留垃圾。
2. 初始化所有变量
给choice、size、val等变量赋初始值,避免未定义行为。
3. 补全变量与函数参数
原代码里的display、sort等函数需要接收数组参数才能操作数组,同时用动态分配数组替代固定大小数组,适配用户输入的size。
修改后的完整代码
#include <stdio.h> #include <stdlib.h> // 用于malloc/free // 补全功能函数的参数,添加数组指针 void display(int size, int *arr) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } void sort(int size, int *arr) { // 示例冒泡排序实现 for (int i = 0; i < size-1; i++) { for (int j = 0; j < size-i-1; j++) { if (arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } void reverse(int size, int *arr) { for (int i = 0; i < size/2; i++) { int temp = arr[i]; arr[i] = arr[size-1-i]; arr[size-1-i] = temp; } } void search(int val, int size, int *arr) { for (int i = 0; i < size; i++) { if (arr[i] == val) { printf("Value found at index %d\n", i); return; } } printf("Value not found\n"); } int main() { int choice = 0; int size = 0; int val = 0; int *arr = NULL; printf("Enter the size of array: "); // 处理数组大小输入,确保是正整数 while (scanf("%d", &size) != 1 || size <= 0) { while (getchar() != '\n'); // 清空缓冲区 printf("Invalid input, please enter a positive integer: "); } // 动态分配数组内存 arr = (int*)malloc(size * sizeof(int)); if (arr == NULL) { printf("Memory allocation failed\n"); return 1; } printf("Enter %d elements: \n", size); for (int i = 0; i < size; i++) { // 确保数组元素输入为整数 while (scanf("%d", &arr[i]) != 1) { while (getchar() != '\n'); printf("Invalid input, enter an integer: "); } } do { printf("\n******** Main Menu ********\n"); printf("1. Display\n"); printf("2. Sort\n"); printf("3. Reverse\n"); printf("4. Search\n"); printf("5. Exit\n"); printf("Enter Your Choice: "); // 处理菜单选项输入,确保是有效数字 while (scanf("%d", &choice) != 1) { while (getchar() != '\n'); printf("Invalid input, please enter a number between 1-5: "); } switch (choice) { case 1: display(size, arr); break; case 2: sort(size, arr); printf("Array sorted successfully\n"); break; case 3: reverse(size, arr); printf("Array reversed successfully\n"); break; case 4: printf("Enter the value to search: "); while (scanf("%d", &val) != 1) { while (getchar() != '\n'); printf("Invalid input, enter an integer: "); } search(val, size, arr); break; case 5: printf("Exiting program\n"); break; default: printf("Invalid Choice\n"); break; } } while (choice != 5); free(arr); // 释放动态分配的内存 return 0; }
内容的提问来源于stack exchange,提问作者Tushxr
相关产品推荐
相关产品推荐

