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

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;
}

关键修改说明

  1. 将Sf +=1;移到switch语句外部,确保每次输入合法口味后,Sf都会递增,循环正常推进;
  2. 初始化price = 0.0,避免垃圾值干扰;
  3. 给default分支添加错误提示,并使用continue跳过Sf递增,让用户重新输入当前冰淇淋球的口味;
  4. 格式化价格输出为两位小数,结果更直观。

内容的提问来源于stack exchange,提问作者Robert Westmeyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:17:44