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

C++用户输入数组求和错误排查及代码优化求助

问题排查与优化方案

核心问题分析

你的代码存在多个逻辑错误和语法问题,导致输入"no"时总和计算错误:

  • 数组越界+循环步长错误:for(int i = 0; i <= numsize; i++) 中,数组usersMonthlyExpenses大小为numsize,有效索引是0~numsize-1,i<=numsize会访问越界元素;同时循环内手动执行i++,导致每次循环步长为2,跳过一半元素的输入。
  • 递归调用破坏状态:选择"yes"时递归调用getInfo,会重置局部变量sum,且之前输入的数组数据会被新的输入覆盖,完全打乱累加逻辑。
  • 重复累加总和:输入"no"时,你在已经累加过sum的基础上,又遍历数组重新累加一次,导致总和翻倍(甚至更多)。
  • 输入逻辑混乱:每次输入要求用户先输入数字再输入字符串(cin>>usersMonthlyExpenses[i]; cin>>done;),不符合用户只输入数字直到"done"或达到数量的预期,会导致输入不匹配。
  • 语法错误:cout<<sum后缺少分号,编译无法通过;选择非"yes/no"时,仅重新输入choice但未再次判断,直接进入下一轮循环。

修复后的代码

用vector替代固定数组实现动态扩展,重构输入和累加逻辑,去掉错误的递归:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

void getInfo() {
    vector<int> usersMonthlyExpenses;
    int expense;
    string input;
    int sum = 0;

    cout << "请输入你的支出,输入done结束,或输入满5项后可选择继续添加:" << endl;

    while (true) {
        // 读取输入,先判断是否为done
        cin >> input;
        if (input == "done") {
            break;
        }

        // 尝试转换为数字
        try {
            expense = stoi(input);
            usersMonthlyExpenses.push_back(expense);
            sum += expense;
        } catch (...) {
            cout << "无效输入,请输入数字或done:" << endl;
            continue;
        }

        // 每满5项询问是否继续
        if (usersMonthlyExpenses.size() % 5 == 0) {
            string choice;
            cout << "已输入" << usersMonthlyExpenses.size() << "项,是否继续添加?输入yes/no:";
            while (true) {
                cin >> choice;
                if (choice == "yes") {
                    break;
                } else if (choice == "no") {
                    goto end_input; // 直接跳转到输出总和
                } else {
                    cout << "请输入yes或no:";
                }
            }
        }
    }

end_input:
    cout << "你的月度支出总额为:" << sum << endl;
}

int main() {
    getInfo();
    return 0;
}

优化建议

  • 使用动态容器:避免固定大小数组的限制,vector可以自动扩展,更适合不确定输入数量的场景。
  • 分离输入与计算逻辑:将输入数据、计算总和、输出结果拆分为独立函数,代码更清晰易维护。
  • 输入校验:添加对非数字输入的处理,避免程序崩溃或逻辑混乱。
  • 避免递归与goto(可选):如果不想用goto,可以用标志变量控制循环退出,代码更符合结构化编程规范。
  • 移除冗余头文件:代码中未使用<locale>,可以删除以减少编译依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:05:36