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

C语言循环(for/while)内使用Switch case计算票务总价时循环异常问题

问题原因

你的代码循环异常的核心原因是输入缓冲区残留了换行符:

  • 调用scanf("%d", &n)读取购票数量时,用户输入完成后按下的回车键会产生\n字符,该字符会残留在输入缓冲区中
  • 后续循环内的scanf("%c", &c)读取字符时不会自动跳过空白字符,第一次执行会直接读取到残留的\n,不会等待用户主动输入,因此会出现循环异常迭代的现象,和你使用的循环类型、存储容器无关。

修复方案

在读取票种的scanf格式符前添加一个空格,即可让接口自动跳过所有前置空白字符(包含换行、空格、制表符等),将原代码中的scanf("%c",&c);修改为scanf(" %c",&c);即可解决核心问题。
你还可以补充非法输入处理逻辑,避免用户输错票种时浪费计数。

修复后完整代码

#include <stdio.h>

int main()
{
   int n;
   printf("请问您需要购买多少张票?\n");
   scanf("%d", &n);
   char ticket_type;
   float total = 0;
   while(n)
   {
       printf("请输入当前票的类型(E/A/T):\n");
       // 格式符前加空格跳过输入缓冲区残留的空白字符
       scanf(" %c", &ticket_type);
       switch (ticket_type)
       {
        case 'E':
            total += 0.23;
            break;
        case 'A':
            total += 0.7;
            break;
        case 'T':
            total += 0.15;
            break;
        default:
            printf("无效的票种,请输入E、A、T中的有效值重试\n");
            // 不扣减剩余票数,让用户重新输入
            continue;
       }
       n--;
   }
   printf("总票价为:%f\n", total);
   return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:06:04