循环Switch菜单中Case4数组最后元素无法显示的问题求助
问题分析与修复方案
核心问题1:未初始化的可变长度数组(VLA)
你在main函数开头声明int a,b,c,d,diff,array[diff],e,i,input;时,diff是未初始化的局部变量,初始值是随机垃圾值。这导致array的大小完全不确定,后续给数组赋值或访问元素时极易触发数组越界——单独运行Case4代码时,随机值可能刚好凑成可用状态,但放到循环菜单里,每次循环的垃圾值不同,问题就暴露了。
核心问题2:数组大小计算错误
从a到d的数字总个数是d - a + 1(比如a=2、d=5时,数字是2、3、4、5共4个),但你用diff = d - a得到3,直接用array[diff]会少一个元素的存储空间,这也是无法显示最后一个元素的直接原因。
核心问题3:冗余且危险的提前赋值
Case4里的array[diff]=d;完全多余,后面的for循环会逐个覆盖数组元素,而且在数组大小错误的情况下,这行代码还会直接触发越界访问。
修复后的完整代码
把数组array的声明移到Case4内部,每次进入该分支都根据当前的diff创建合适大小的数组,同时修正逻辑错误:
#include <stdio.h> int main () { char first[20],last[20]; float math,eng,sci,avg; int a,b,c,d,diff,e,i,input; // 移除全局array声明 do{ printf("\nMAIN MENU\n"); printf("[1] Basic Input Output\n[2] Conditional Statement\n[3] Looping Construct\n[4] Array\n[5] About\n[6] Exit"); printf("\n\nChoose: "); scanf("%d",&input); printf("\n"); switch (input) { case 1: printf("\nEnter your given name:"); scanf("%s",first); printf("Enter your surname:"); scanf("%s",last); printf("\nHello %s %s!\n",first,last); break; case 2: printf("\nEnter your grade in Math:"); scanf("%f",&math); printf("\nEnter your grade in Science:"); scanf("%f",&sci); printf("\nEnter your grade in English:"); scanf("%f",&eng); avg=(math+eng+sci)/3; // 修正条件判断逻辑,原写法&&sci是错误的 if(math>eng && math>sci) { printf("\nHighest grade is in: Math"); } if(eng>math && eng>sci) { printf("\nHighest grade is in: English"); } if(sci>eng && sci>math) { printf("\nHighest grade is in: Science"); } if(math==eng) { printf("\n--Math and English tied grades--"); } if(math==sci) { printf("\n--Math and Science tied grades--"); } if(eng==sci) { printf("\n--Science and English tied grades--"); } printf("\nYour average in 3 subjects:%f\n",avg); break; case 3: printf("Enter beginning number: "); scanf("%d",&b); printf("Enter ending number: "); scanf("%d",&c); printf("\nCounting from %d to %d\n",b,c); while(b<=c) { printf("%d ",b); b++; } printf("\n"); break; case 4: printf("Enter Starting Series of Numbers: "); scanf("%d",&a); printf("Enter Ending Series of Numbers: "); scanf("%d",&d); diff = d - a; int array[diff + 1]; // 按需声明数组,大小刚好容纳所有元素 printf("Select Array Value to Display: 0 to %d: ",diff); scanf("%d",&e); // 先填充整个数组 for(i=0;i<=diff;i++) { array[i] = a + i; // 直接计算元素值,不修改原变量a } // 增加索引合法性检查 if(e >=0 && e <= diff) { printf("%d\n",array[e]); } else { printf("Invalid index! Please enter between 0 and %d\n",diff); } break; case 5: printf("Abouts\n"); break; case 6: printf("Thank you!"); break; } }while(input != 6); return 0; }
额外优化点
- 修正了Case2中错误的条件判断逻辑,原代码的
&&sci会错误判断sci是否非零,改为正确的数值比较。 - 增加了索引合法性检查,防止用户输入超出范围的索引导致程序崩溃。
- 填充数组时直接用
a+i计算元素值,避免修改原变量a,逻辑更清晰。
内容的提问来源于stack exchange,提问作者IllustriousKage
相关产品推荐
相关产品推荐

