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

C语言菜单程序陷入循环,持续输出‘Invalid Choice’问题求助

解决C语言菜单程序持续输出"Invalid Choice"的死循环问题

你遇到的死循环核心问题出在scanf("%d", &choice)的输入处理逻辑上,同时代码还存在几个编译级别的问题,逐一拆解:

问题根源

  1. 输入不匹配导致的缓冲区残留:
    当你输入非整数(比如字母、符号、空格)时,scanf("%d")会匹配失败,此时choice的取值不会被更新(如果没初始化就是随机垃圾值),而且这些不匹配的字符会留在输入缓冲区里。下一次循环时,scanf会直接读取缓冲区里的垃圾字符,再次匹配失败,choice始终不符合任何case分支,持续触发default输出提示,陷入死循环。
  2. 未声明变量:代码里的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 02:50:43