如何修复银行菜单程序中switch默认错误及相关问题?
银行菜单程序问题排查与修复
问题现象
- 菜单首次运行正常,从第二次迭代开始操作会重复执行两次,且每次都会触发默认分支的
Choose a valid option!提示 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]); }
问题根源分析
- 输入缓冲区残留问题:
scanf("%c", &letter)会读取输入时留下的换行符(比如用户输入G后按回车,回车的\n会留在缓冲区),第二次循环时letter被赋值为\n,触发switch的默认分支,造成重复执行的假象。 - 数组初始化错误:
int deposits[] = {};在C标准中是非法的,会创建大小为0的数组,存入数据时会发生越界,导致未定义行为。 - average函数精度丢失:用
int存储平均值,整数除法会直接丢弃小数部分,无法得到精确结果。 - 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
相关产品推荐
相关产品推荐

