为何while循环中的switch case无法正常运行?重复输出问题求解
成绩统计程序重复输出问题及修复方案
问题描述
需求:实现一个程序,让用户输入A到F的成绩(支持大小写),直到输入!时停止,随后输出各类成绩的统计数量。但以下代码运行时会重复输出内容,无法正常工作:
#include <stdio.h> int main() { char ocjena; int zbrojUkupan = 0, zbrojA = 0, zbrojB = 0, zbrojC = 0, zbrojD = 0, zbrojF = 0; do { printf("Unesite svoje ocjene:\n"); scanf("%c", &ocjena); switch(ocjena){ case 'A': case 'a': zbrojA += 1; zbrojUkupan += 1; break; case 'B': case 'b': zbrojB += 1; zbrojUkupan += 1; break; case 'C': case 'c': zbrojC += 1; zbrojUkupan += 1; break; case 'D': case 'd': zbrojC += 1; zbrojUkupan += 1; break; case 'F': case 'f': zbrojC += 1; zbrojUkupan += 1; break; default: printf("Unijeli ste krivu ocjenu\n"); } } while (ocjena != '!'); printf("Broj unesenih ocjena je %d, zbroj A je %d, zbroj B je %d, zbroj c je %d, zbroj F je %d", zbrojUkupan, zbrojA, zbrojB, zbrojC, zbrojD, zbrojF); return 0; }
问题根源分析
- 输入缓冲区换行符残留:
scanf("%c", &ocjena)会读取输入缓冲区的所有字符,包括用户输入成绩后按下的换行符\n。比如用户输入A并回车,缓冲区存A\n,第一次scanf读取A,第二次循环直接读取\n,触发default分支输出错误提示,导致重复输出。 - 分支统计逻辑错误:
D和F的case分支中,错误地将计数累加到zbrojC,而非对应的zbrojD和zbrojF,统计结果完全失真。 - 输出格式不匹配:最终
printf的格式字符串仅定义5个占位符,却传入6个变量,还遗漏了zbrojD的输出项,且zbroj c字母大小写不一致。 - 终止符错误提示:用户输入
!时,程序会进入default分支输出错误提示,不符合需求逻辑。
修复方案及代码
修正后的完整代码如下:
#include <stdio.h> int main() { char ocjena; int zbrojUkupan = 0, zbrojA = 0, zbrojB = 0, zbrojC = 0, zbrojD = 0, zbrojF = 0; do { printf("Unesite svoje ocjene:\n"); // 加空格跳过空白字符(含换行符) scanf(" %c", &ocjena); // 输入!时直接跳出循环,不触发统计和错误提示 if (ocjena == '!') { break; } switch(ocjena){ case 'A': case 'a': zbrojA += 1; zbrojUkupan += 1; break; case 'B': case 'b': zbrojB += 1; zbrojUkupan += 1; break; case 'C': case 'c': zbrojC += 1; zbrojUkupan += 1; break; case 'D': case 'd': // 修正为zbrojD计数 zbrojD += 1; zbrojUkupan += 1; break; case 'F': case 'f': // 修正为zbrojF计数 zbrojF += 1; zbrojUkupan += 1; break; default: printf("Unijeli ste krivu ocjenu\n"); } } while (1); // 内部判断!后break,简化循环条件 // 修正输出格式,匹配所有统计变量 printf("Broj unesenih ocjena je %d, zbroj A je %d, zbroj B je %d, zbroj C je %d, zbroj D je %d, zbroj F je %d\n", zbrojUkupan, zbrojA, zbrojB, zbrojC, zbrojD, zbrojF); return 0; }
关键修复点说明
scanf格式字符串前添加空格" %c",自动跳过输入缓冲区中的空白字符(换行符、空格等),确保每次读取有效输入字符。- 增加
!的前置判断,输入终止符时直接跳出循环,避免错误提示。 - 修正
D和F分支的计数变量,保证统计逻辑正确。 - 调整
printf格式字符串,包含所有成绩统计项,确保占位符与变量数量、顺序完全匹配。
内容的提问来源于stack exchange,提问作者lala
相关产品推荐
相关产品推荐

