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
相关产品推荐
相关产品推荐

