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

