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

如何修复银行菜单程序中switch默认错误及相关问题?

银行菜单程序问题排查与修复

问题现象

  1. 菜单首次运行正常,从第二次迭代开始操作会重复执行两次,且每次都会触发默认分支的Choose a valid option!提示
  2. average函数只能输出整数结果,无法显示精确的浮点平均值

原代码

#include <stdio.h>

void askForInput(int arr5[], int dep);
void fSum(int arr[], int n);
void sortDep(int arr2[], int n1);
void average(int arr3[], int n2);
void lowestVal(int arr4[], int n3);

int d = 0;
int deposits[] = {};

int main() {
    char letter;
    do {
        printf("****BANK MENU****\n"
               "[G]et a new deposit\n"
               "[S]um of all deposits\n"
               "[D]isplay deposits\n"
               "[A]verage\n"
               "[L]owest\n"
               "[Q]uit\n"
               "Please enter a letter: ");

        scanf("%c", &letter);

        switch (letter) {
          case 'G':
            askForInput(deposits, d);
            printf("\n");
            d++;
            break;

          case 'S':
            fSum(deposits, d);
            printf("\n");
            break;

         case 'D':
           sortDep(deposits, d);
           printf("These are your deposits:\n");
           for (int k = 0; k < d; k++)
               printf("%d ",deposits[k]);
           printf("\n");
           break;

         case 'A':
           average(deposits, d);
           printf("\n");
           break;

         case 'L':
           lowestVal(deposits,d);
           printf("\n");
           break;

         case 'Q':;
         default:
           printf("Choose a valid option!\n");
       }
    } while (letter != 'Q');
    return 0;
}

void askForInput(int arr5[], int dep) {
    printf("Please enter a deposit:\n");
    scanf("%d", &(arr5[dep]));
}

void fSum(int arr[], int n) {
    int sum = 0;
    for (int x = 0; x < n; x++)
        sum = sum + arr[x];
    printf("The sum of the deposits is %d", sum);
}

void sortDep(int arr2[], int n1) {
    int i, j, temp;
    for (i = 0; i < n1 - 1; i++)
        for (j = 0; j < n1 - i - 1; j++)
            if (arr2[j] < arr2[j + 1]) {
                temp = arr2[j];
                arr2[j] = arr2[j + 1];
                arr2[j + 1] = temp;
            }
}

void average(int arr3[], int n2) {
    int sumation = 0;
    int avg;
    for (int u = 0; u < n2; u++) {
        sumation += arr3[u];
    }
    avg = sumation / n2;
    printf("The average of the deposits is %d", avg);
}

void lowestVal(int arr4[], int n3) {
    int minIndex = 0;
    for (int index = 1; index < n3; index++) {
        if (arr4[minIndex] > arr4[index])
            minIndex = index;
    }
    printf("The lowest deposit is %d", arr4[minIndex]);
}

问题根源分析

  1. 输入缓冲区残留问题:scanf("%c", &letter)会读取输入时留下的换行符(比如用户输入G后按回车,回车的\n会留在缓冲区),第二次循环时letter被赋值为\n,触发switch的默认分支,造成重复执行的假象。
  2. 数组初始化错误:int deposits[] = {};在C标准中是非法的,会创建大小为0的数组,存入数据时会发生越界,导致未定义行为。
  3. average函数精度丢失:用int存储平均值,整数除法会直接丢弃小数部分,无法得到精确结果。
  4. switch分支逻辑错误:case 'Q'后没有break,执行完Q分支后会继续进入default分支,导致退出时也会打印错误提示。

修复方案

1. 处理输入缓冲区

将scanf("%c", &letter);改为scanf(" %c", &letter);,前面的空格会自动跳过所有空白字符(包括换行、空格等),避免读取残留的换行符。

2. 修正数组定义

定义一个固定大小的数组(比如支持最多100条存款记录),避免越界:

#define MAX_DEPOSITS 100
int deposits[MAX_DEPOSITS];

同时在askForInput调用前检查d是否小于MAX_DEPOSITS,防止数组越界。

3. 修复average函数精度问题

将求和变量改为long避免溢出,平均值用double存储,输出时使用浮点格式:

void average(int arr3[], int n2) {
    if (n2 == 0) {
        printf("No deposits to calculate average!");
        return;
    }
    long sumation = 0;
    double avg;
    for (int u = 0; u < n2; u++) {
        sumation += arr3[u];
    }
    avg = (double)sumation / n2;
    printf("The average of the deposits is %.2f", avg);
}

4. 修正switch分支逻辑

给case 'Q'添加break,避免执行default分支:

case 'Q':
    break;
default:
    printf("Choose a valid option!\n");

5. 添加边界检查

在case 'G'中检查是否还有数组空间,同时给其他功能添加空数据判断,避免无存款时执行计算逻辑:

case 'G':
    if (d >= MAX_DEPOSITS) {
        printf("Maximum number of deposits reached!\n\n");
        break;
    }
    askForInput(deposits, d);
    printf("\n");
    d++;
    break;

修复后的完整代码

#include <stdio.h>

#define MAX_DEPOSITS 100

void askForInput(int arr5[], int dep);
void fSum(int arr[], int n);
void sortDep(int arr2[], int n1);
void average(int arr3[], int n2);
void lowestVal(int arr4[], int n3);

int d = 0;
int deposits[MAX_DEPOSITS];

int main() {
    char letter;
    do {
        printf("****BANK MENU****\n"
               "[G]et a new deposit\n"
               "[S]um of all deposits\n"
               "[D]isplay deposits\n"
               "[A]verage\n"
               "[L]owest\n"
               "[Q]uit\n"
               "Please enter a letter: ");

        // 跳过空白字符,避免读取换行符
        scanf(" %c", &letter);

        switch (letter) {
          case 'G':
            if (d >= MAX_DEPOSITS) {
                printf("Maximum number of deposits reached!\n\n");
                break;
            }
            askForInput(deposits, d);
            printf("\n");
            d++;
            break;

          case 'S':
            if (d == 0) {
                printf("No deposits to calculate sum!\n");
            } else {
                fSum(deposits, d);
            }
            printf("\n");
            break;

         case 'D':
            if (d == 0) {
                printf("No deposits to display!\n");
            } else {
                sortDep(deposits, d);
                printf("These are your deposits:\n");
                for (int k = 0; k < d; k++)
                    printf("%d ", deposits[k]);
            }
            printf("\n");
            break;

         case 'A':
            average(deposits, d);
            printf("\n");
            break;

         case 'L':
            if (d == 0) {
                printf("No deposits to find lowest value!\n");
            } else {
                lowestVal(deposits, d);
            }
            printf("\n");
            break;

         case 'Q':
            break;
         default:
           printf("Choose a valid option!\n");
       }
    } while (letter != 'Q');
    return 0;
}

void askForInput(int arr5[], int dep) {
    printf("Please enter a deposit:\n");
    scanf("%d", &(arr5[dep]));
}

void fSum(int arr[], int n) {
    long sum = 0;
    for (int x = 0; x < n; x++)
        sum = sum + arr[x];
    printf("The sum of the deposits is %ld", sum);
}

void sortDep(int arr2[], int n1) {
    int i, j, temp;
    for (i = 0; i < n1 - 1; i++)
        for (j = 0; j < n1 - i - 1; j++)
            if (arr2[j] < arr2[j + 1]) {
                temp = arr2[j];
                arr2[j] = arr2[j + 1];
                arr2[j + 1] = temp;
            }
}

void average(int arr3[], int n2) {
    if (n2 == 0) {
        printf("No deposits to calculate average!");
        return;
    }
    long sumation = 0;
    double avg;
    for (int u = 0; u < n2; u++) {
        sumation += arr3[u];
    }
    avg = (double)sumation / n2;
    printf("The average of the deposits is %.2f", avg);
}

void lowestVal(int arr4[], int n3) {
    int minIndex = 0;
    for (int index = 1; index < n3; index++) {
        if (arr4[minIndex] > arr4[index])
            minIndex = index;
    }
    printf("The lowest deposit is %d", arr4[minIndex]);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 03:27:05