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

代码在退出分支(如case '0')时崩溃,疑似与while循环相关

问题根源与修复方案

嘿,我一眼就揪出导致程序崩溃的问题了——这是个典型的内存越界访问问题,和while循环本身没关系,完全是scanf的使用错误导致的!

具体问题分析

你代码里的这行是罪魁祸首:

scanf ("%s", &menu_option);

%s是scanf用来读取字符串的格式符,它会把输入的字符自动追加一个字符串终止符\0一起写入内存。但你的menu_option只是一个单个的char变量,只有1字节的存储空间。当你输入任何字符(比如退出用的'0'),scanf会尝试把这个字符+\0总共2字节的数据写入&menu_option指向的地址,这就直接超出了menu_option的内存范围,会覆盖相邻的变量(比如你的run变量),导致内存损坏,程序直接崩溃。

两种修复方案

根据你的需求,这里有两种靠谱的修复方式:

方案1:读取单个字符(推荐,因为菜单选项是单个字符)

把scanf的格式符改成%c,同时注意跳过输入缓冲区里的空白字符(比如上次输入后的换行符),修改后的代码如下:

#include <stdio.h>
int main() { // 注意:C标准要求main函数返回int,不是void
    int run=1;
    char menu_option;
    while (run==1) {
        printf("Choose case:\n");
        scanf(" %c", &menu_option); // 前面的空格用来跳过空白字符
        switch (menu_option) {
            case '1': printf("1\n"); break;
            case '2': printf("2\n"); break;
            case '0': run=0; break;
            // 其余分支省略
        }
    }
    return 0;
}

方案2:改用字符数组存储输入

如果你需要支持多字符输入(虽然你的场景不需要,但可以了解),把menu_option改成字符数组,给字符串终止符留足空间:

#include <stdio.h>
int main() {
    int run=1;
    char menu_option[2]; // 1字节存字符,1字节存终止符
    while (run==1) {
        printf("Choose case:\n");
        scanf("%s", menu_option);
        switch (menu_option[0]) { // 取数组第一个字符判断
            case '1': printf("1\n"); break;
            case '2': printf("2\n"); break;
            case '0': run=0; break;
            // 其余分支省略
        }
    }
    return 0;
}

额外提示

顺便提一句,void main()不是标准的C语言写法,标准要求main函数必须返回int类型,所以改成int main()并返回0是更规范的做法,虽然这不是导致崩溃的直接原因,但养成好习惯很重要~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:40:36