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

C++基础ATM程序取款负金额透支与死循环Bug修复求助

问题根因

你的代码有两个核心逻辑错误,直接导致遇到的两类bug:

  • 校验逻辑拆分且顺序错误:你把「余额是否足够」和「取款金额是否为正」拆成了两个独立的while循环,用户在第二个循环(校验金额为正)里输入的新金额不会再回头校验余额,存在逻辑绕过空间:当余额为0时,用户先输入任意正数触发余额不足提示,再输入负数跳出余额校验循环,最后输入任意大的正数就能跳过余额检查直接扣款,造成透支。
  • 无取款流程退出通道:当账户余额为0时,所有合法的正取款金额都大于0,永远满足余额 < 取款金额的循环条件,你没有给用户提供取消取款、返回菜单的选项,程序必然陷入死循环。
修复步骤
  1. 合并所有取款金额校验规则到同一个循环,每次用户输入新金额后,同时检查「输入是否为有效数字」「金额是否大于0(允许输入0取消取款)」「金额是否不超过当前余额」,任意规则不满足就提示错误并重新输入。
  2. 余额为0时直接提示无法取款,返回账户菜单,避免无意义的输入循环。
  3. 补充cin输入错误处理,避免用户输入非数字时程序进入异常死循环。
  4. 支票账户的取款逻辑和储蓄账户逻辑完全一致,同步修改即可。
修正后的储蓄账户取款模块代码
// 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:09:22