C语言中char输入结合switch case的程序异常问题求助
问题分析与修复
核心问题1:Sf递增语句位置错误
你的代码中Sf += 1;被放在switch语句的末尾,只有执行default分支时才会触发。因为每个合法口味的case分支都用break跳出了switch,不会走到Sf +=1这行。这就导致每次输入合法口味后,Sf的值不会增加,while(Sf <= S)的条件永远成立,程序会反复询问同一个冰淇淋球的口味,直到输入的字符触发default分支(比如数字),Sf才会递增,循环才会推进。
核心问题2:price未初始化
float price;定义时没有赋初始值,它会持有内存中的随机垃圾值,最终累加出来的价格完全错误。
其他可选优化
- 标准C中推荐使用
int main()而非void main(),并在末尾返回0; default分支可以添加错误提示,引导用户输入合法口味;- 输出价格时用
%.2f格式化,保留两位小数更符合货币展示逻辑。
修正后的代码
#include <stdio.h> int main(void) { float price = 0.0; // 初始化价格为0 char F; int S; int Sf = 1; printf("\nHow many scoops do you want? You can choose 1 to 10 scoops\n"); scanf("%d", &S); printf("\nHere are your flavor options: Vanilla (V) Chocolate (C) Strawberry (S) Oreo (O) Butter Pecan (B)"); while (Sf <= S) { printf("\nWhat flavor do you want for scoop %d?\n", Sf); scanf(" %c", &F); switch (F) { case 'V': price += 0.70; break; case 'C': price += 0.75; break; case 'S': price += 0.80; break; case 'O': price += 0.85; break; case 'B': price += 0.90; break; default: printf("Invalid flavor! Please enter a valid option.\n"); continue; // 跳过递增,重新询问当前球的口味 } Sf += 1; // 将递增语句移到switch外面,合法输入后才递增 } printf("\n\nTotal price: $%.2f\n", price); return 0; }
关键修改说明
- 将
Sf +=1;移到switch语句外部,确保每次输入合法口味后,Sf都会递增,循环正常推进; - 初始化
price = 0.0,避免垃圾值干扰; - 给
default分支添加错误提示,并使用continue跳过Sf递增,让用户重新输入当前冰淇淋球的口味; - 格式化价格输出为两位小数,结果更直观。
内容的提问来源于stack exchange,提问作者Robert Westmeyer
相关产品推荐
相关产品推荐

