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

循环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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:25:17