嵌套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
相关产品推荐
相关产品推荐

