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

C语言char变量异常:do while循环菜单二次输入无响应问题排查

问题原因与解决方法

核心问题:输入缓冲区残留的换行符干扰

当你在case 'a'中执行scanf("%d", &x)时,输入数字后按下的回车键会留下一个\n在输入缓冲区里。下一次循环执行scanf("%c", &pick)时,会直接读取这个残留的换行符,而不是你输入的菜单选项,再加上后面的getchar()又会读取下一个字符,导致程序出现无响应的假象。

解决步骤

  • 优化菜单选项的输入:把scanf("%c", &pick)改成scanf(" %c", &pick)(注意%c前的空格),这个空格会自动跳过输入缓冲区里的所有空白字符(包括换行、空格、制表符),不需要再单独调用getchar(),避免重复处理。
  • 处理数字输入后的换行符:如果保留原来的写法,就在scanf("%d", &x)之后加一句getchar(),把残留的换行符吃掉;或者同样给scanf("%d", &x)改成scanf(" %d", &x),靠空格自动跳过空白字符。
  • 修复数组越界问题:你的循环里for (int i = 1; i <= x; i++)是错误的,C语言数组下标从0开始,应该改成for (int i = 0; i < x; i++),否则会访问到数组外的内存,引发未定义行为。

修改后的完整代码

int main() {
    char pick;
    int x;
    int *a;
    do {
        printf("Menu of task\n");
        printf("a.Generate an array:\n");
        printf("b.Sort a given array of names to increasing alphabet\n");
        printf("q.Quit\n");
        // 用带空格的scanf跳过空白字符,不需要getchar()
        scanf(" %c", &pick);

        switch (pick) {
            case 'a':
                printf("Input N:\n");
                // 同样用带空格的scanf处理数字输入
                scanf(" %d", &x);
                a = tax(x);
                // 修正数组遍历的下标范围
                for (int i = 0; i < x; i++)
                    printf("%d ", *(a + i)); 
                printf("\n");
                // 记得释放动态分配的内存,避免内存泄漏
                free(a);
                break;
            case 'b':
                printf("Nah:\n");
                break;
            case 'q':
                printf("Out!");
                break;
            default:
                printf("Wrong syntax\n");
                break;
        }
    } while (pick != 'q');

    return 0;
}

补充:如果tax()函数是用malloc动态分配内存的话,记得在使用完数组后调用free(a),避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:06:02