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

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

问题根源分析

  1. 输入缓冲区换行符残留:scanf("%c", &ocjena)会读取输入缓冲区的所有字符,包括用户输入成绩后按下的换行符\n。比如用户输入A并回车,缓冲区存A\n,第一次scanf读取A,第二次循环直接读取\n,触发default分支输出错误提示,导致重复输出。
  2. 分支统计逻辑错误:D和F的case分支中,错误地将计数累加到zbrojC,而非对应的zbrojD和zbrojF,统计结果完全失真。
  3. 输出格式不匹配:最终printf的格式字符串仅定义5个占位符,却传入6个变量,还遗漏了zbrojD的输出项,且zbroj c字母大小写不一致。
  4. 终止符错误提示:用户输入!时,程序会进入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:45:46