代码在退出分支(如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
相关产品推荐
相关产品推荐

