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

C++填充数组时如何避免数据被覆盖仅保留最后一个值

问题原因与解决方案

核心错误点

  • 填充数组时使用固定的数组长度NEven/NOdd作为下标:C/C++数组下标从0开始,长度为N的数组合法下标范围是0~N-1,你写的even_xs[NEven]本身就是数组越界访问,属于未定义行为;且每次赋值都写同一个位置,自然只会保留最后一次写入的数值。
  • 输出时只打印了单个越界位置的元素,没有遍历整个数组输出所有内容。
  • 额外注意:C++标准不支持变长数组(VLA,即使用变量作为数组长度的写法int odd_xs[NOdd]),这是C语言特性,仅部分编译器做了兼容,更稳妥的写法是改用std::vector存储拆分后的奇偶数组。

修正后代码

#include <iostream>
#include <vector>

void evensOdds(){
    int xs[18]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,555,558,333};
    int Odd = 0;
    int Even = 0;

    // 统计奇偶数量
    for (int i=0; i<18; i++){
        if (xs[i]%2 == 0) {
            Even++;
        } else {
            Odd++;
        }
    }

    // 改用vector避免变长数组兼容问题
    std::vector<int> odd_xs;
    std::vector<int> even_xs;
    odd_xs.reserve(Odd); // 预分配空间提升效率
    even_xs.reserve(Even);

    // 填充数组,自动维护索引
    for (int i=0; i<18; i++){
        if (xs[i]%2 == 0) {
            even_xs.push_back(xs[i]);
        } else {
            odd_xs.push_back(xs[i]);
        }
    }  

    std::cout << "Number of odds in the array:  " << Odd << std::endl;
    std::cout << "Number of evens in the array:  " << Even << std::endl;

    // 遍历输出所有奇数
    std::cout << "odd_xs array = ";
    for (int i=0; i<odd_xs.size(); i++){
        if(i>0) std::cout << ", ";
        std::cout << odd_xs[i];
    }
    std::cout << std::endl;

    // 遍历输出所有偶数
    std::cout << "even_xs array = ";
    for (int i=0; i<even_xs.size(); i++){
        if(i>0) std::cout << ", ";
        std::cout << even_xs[i];
    }
    std::cout << std::endl;

    return;
}

如果你坚持用原生数组(仅适配支持VLA的编译器),只需要修改赋值和输出逻辑即可:

// 填充部分修改为
int odd_idx = 0, even_idx = 0;
for (int i=0; i<18; i++){
    if (xs[i]%2 == 0) {
        even_xs[even_idx++] = xs[i];
    } else {
        odd_xs[odd_idx++] = xs[i];
    }
}

// 输出部分修改为对应长度的遍历循环即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:27:04