C++基础ATM程序取款负金额透支与死循环Bug修复求助
问题根因
你的代码有两个核心逻辑错误,直接导致遇到的两类bug:
- 校验逻辑拆分且顺序错误:你把「余额是否足够」和「取款金额是否为正」拆成了两个独立的while循环,用户在第二个循环(校验金额为正)里输入的新金额不会再回头校验余额,存在逻辑绕过空间:当余额为0时,用户先输入任意正数触发余额不足提示,再输入负数跳出余额校验循环,最后输入任意大的正数就能跳过余额检查直接扣款,造成透支。
- 无取款流程退出通道:当账户余额为0时,所有合法的正取款金额都大于0,永远满足
余额 < 取款金额的循环条件,你没有给用户提供取消取款、返回菜单的选项,程序必然陷入死循环。
修复步骤
- 合并所有取款金额校验规则到同一个循环,每次用户输入新金额后,同时检查「输入是否为有效数字」「金额是否大于0(允许输入0取消取款)」「金额是否不超过当前余额」,任意规则不满足就提示错误并重新输入。
- 余额为0时直接提示无法取款,返回账户菜单,避免无意义的输入循环。
- 补充cin输入错误处理,避免用户输入非数字时程序进入异常死循环。
- 支票账户的取款逻辑和储蓄账户逻辑完全一致,同步修改即可。
修正后的储蓄账户取款模块代码
// Withdrawal selection for Savings Account if (savings_menu == 1) { // 余额为0直接提示,避免死循环 if (savings_balance <= 0) { cout << "Your savings account has no available funds to withdraw.\n\n"; } else { cout << "How much would you like to withdraw from your savings account (enter 0 to cancel): "; cin >> savings_amount; cout << "\n"; // 所有校验合并到同一个循环,每次输入后全量检查 while (true) { // 处理非数字输入的异常 if (cin.fail()) { cin.clear(); cin.ignore(1000, '\n'); cout << "Invalid input, please enter a valid number: "; cin >> savings_amount; cout << "\n"; continue; } // 输入0则取消取款,跳出循环 if (savings_amount == 0) { cout << "Withdrawal cancelled.\n\n"; break; } // 金额小于0提示重新输入 if (savings_amount < 0) { cout << "Please enter an amount greater than 0, or enter 0 to cancel: "; cin >> savings_amount; cout << "\n"; continue; } // 余额不足提示重新输入 if (savings_balance < savings_amount) { cout << "You do not have enough funds in your account to withdraw that much\n"; cout << "Please enter a smaller amount, or enter 0 to cancel: "; cin >> savings_amount; cout << "\n"; continue; } // 所有校验通过,执行扣款 savings_balance -= savings_amount; cout << "Your Savings Account Balance: " << savings_balance << "\n\n"; if (savings_balance == 0) { cout << "You now have zero funds in your Savings Account.\n\n"; } break; } } }
内容的提问来源于stack exchange,提问作者Crins0n
相关产品推荐
相关产品推荐

