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

嵌套switch case分支执行异常求助(要求仅用switch case实现)

问题:嵌套Switch Case仅Case 1生效,其余Case无法正确计算价格

程序用于根据菜品编号、尺寸和数量计算总价格,但外层switch(item_number)的Case 2-4无法正常工作,只有Case 1能输出正确价格,且要求必须使用Switch Case实现,不能用if...else。

原程序代码

#include <stdio.h>
int main()
{
    int item_number, dish_quantity;
    char dish_size;
    float price, total;

    //显示菜单
    printf("\t\t\t\t菜单\t\t\t\t\n");
    printf("--------------------------------------------------------------------\n");
    printf("菜品编号   菜品名称\t\t\t 菜品尺寸              \n");
    printf("\t\t\t\t小份(RM)   中份(RM)   大份(RM)\n");
    printf("--------------------------------------------------------------------\n");
    printf("     1        Ikan Tenggiri       10.00      20.00        30.00\n");
    printf("     2        Ikan Pari            8.00      15.00        25.00\n");
    printf("     3        Ikan Jenahak         9.00      17.00        28.00\n");
    printf("     4        Daging              10.00      20.00        30.00\n");
    printf("--------------------------------------------------------------------\n\n");

    // 用户输入
    printf("请输入菜品编号        : ");
    scanf("%d", &item_number);
    printf("请输入菜品尺寸 (S/M/L)  : ");
    scanf("%s", &dish_size);
    printf("请输入菜品数量      : ");
    scanf("%d", &dish_quantity);

    switch (item_number){
    case 1: switch (dish_size){
                case 's': case 'S': price = 10.00; break;
                case 'm': case 'M': price = 20.00; break;
                case 'l': case 'L': price = 30.00; break;}

        case 2: switch (dish_size){
                case 's': case 'S': price = 8.00; break;
                case 'm': case 'M': price = 15.00; break;
                case 'l': case 'L': price = 25.00; break;}

        case 3: switch (dish_size){
                case 's': case 'S': price = 9.00; break;
                case 'm': case 'M': price = 17.00; break;
                case 'l': case 'L': price = 28.00; break;}

        case 4: switch (dish_size){
                case 's': case 'S': price = 10.00; break;
                case 'm': case 'M': price = 20.00; break;
                case 'l': case 'L': price = 30.00; break;}

        }

    printf("单份菜品价格      : RM %.2f\n", price);

    total = dish_quantity * price;

    printf("总费用             : RM %.2f", total);

    return 0;
}

问题原因及修复方案

1. 外层Switch Case缺少Break语句

Switch Case的执行逻辑是:匹配到对应Case后,会继续执行后续所有Case的代码,直到遇到break或Switch结束。原程序中,外层Switch的每个Case都没有加break,导致:

  • 选择Case 1时,会依次执行Case 1→Case 2→Case 3→Case 4的嵌套Switch,最后price被Case 4的Switch覆盖,刚好和Case 1的价格一致(都是10/20/30),所以看起来正常;
  • 选择Case 2-4时,执行完当前Case后会继续执行后续Case,最终price被Case 4的Switch结果覆盖,导致显示错误价格。

修复:给每个外层Case添加break

2. 读取字符时的格式错误

scanf("%s", &dish_size);中,%s用于读取字符串,但dish_size是单个char类型变量,会导致缓冲区溢出,可能破坏其他变量的值,或读取到错误的字符。

修复:改用%c读取单个字符,且在格式符前加空格跳过输入缓冲区的换行符:scanf(" %c", &dish_size);

修复后的完整代码

#include <stdio.h>
int main()
{
    int item_number, dish_quantity;
    char dish_size;
    float price, total;

    //显示菜单
    printf("\t\t\t\t菜单\t\t\t\t\n");
    printf("--------------------------------------------------------------------\n");
    printf("菜品编号   菜品名称\t\t\t 菜品尺寸              \n");
    printf("\t\t\t\t小份(RM)   中份(RM)   大份(RM)\n");
    printf("--------------------------------------------------------------------\n");
    printf("     1        Ikan Tenggiri       10.00      20.00        30.00\n");
    printf("     2        Ikan Pari            8.00      15.00        25.00\n");
    printf("     3        Ikan Jenahak         9.00      17.00        28.00\n");
    printf("     4        Daging              10.00      20.00        30.00\n");
    printf("--------------------------------------------------------------------\n\n");

    // 用户输入
    printf("请输入菜品编号        : ");
    scanf("%d", &item_number);
    printf("请输入菜品尺寸 (S/M/L)  : ");
    scanf(" %c", &dish_size); // 修复:用%c读取字符,加空格跳过换行
    printf("请输入菜品数量      : ");
    scanf("%d", &dish_quantity);

    switch (item_number){
    case 1: 
        switch (dish_size){
            case 's': case 'S': price = 10.00; break;
            case 'm': case 'M': price = 20.00; break;
            case 'l': case 'L': price = 30.00; break;
        }
        break; // 添加break,终止外层Switch执行
    case 2: 
        switch (dish_size){
            case 's': case 'S': price = 8.00; break;
            case 'm': case 'M': price = 15.00; break;
            case 'l': case 'L': price = 25.00; break;
        }
        break; // 添加break
    case 3: 
        switch (dish_size){
            case 's': case 'S': price = 9.00; break;
            case 'm': case 'M': price = 17.00; break;
            case 'l': case 'L': price = 28.00; break;
        }
        break; // 添加break
    case 4: 
        switch (dish_size){
            case 's': case 'S': price = 10.00; break;
            case 'm': case 'M': price = 20.00; break;
            case 'l': case 'L': price = 30.00; break;
        }
        break; // 添加break
    }

    printf("单份菜品价格      : RM %.2f\n", price);

    total = dish_quantity * price;

    printf("总费用             : RM %.2f", total);

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:05:10