C++奇偶数列求和程序故障求助:函数异常及N>3时失效问题
C++奇偶分离求和程序问题排查与修复
问题描述
作为C++新手,我编写了一个程序,目标是实现输入数字列表、分离奇偶数列并计算各自的和,但evenodd函数未按预期工作,且当输入数字数量N>3时程序完全无法正常运行。
原代码
#include <iostream> using namespace std; int n=0, E=0, O=0; // E and O index counter void accept (); void evenodd (int[]); int sumEven (int[]); int sumOdd (int[]); void display(int[],int[],int[],int,int); int main() { cout<<"Enter How Many Number You Want to Add \n"; cin>>n; accept(); return 0; } void accept() { int num[n]; for (int x=0;x<n;x++) { cout<<"Enter The Number \n"; cin>>num[x]; } evenodd(num); } void evenodd (int num[]) { int evens[E] , odds[O]; for( int x=0;x<n;x++) { if (num[x]%2==0) { evens[E]=num[x]; E++; } else { odds[O]=num[x]; O++; } } int sumE=sumEven(evens); int sumO=sumOdd(odds); display(num,evens,odds,sumE,sumO); } int sumEven (int evens[]) { int sumE=0; for(int x=0;x<E;x++) sumE+=evens[x]; return sumE; } int sumOdd (int odds []) { int sumO=0; for (int x=0;x<O;x++) sumO+=odds[x]; return sumO; } void display ( int num[], int evens[], int odds[], int sumE, int sumO) { cout<<"The list of numbers to be added is \n"; for (int x=0;x<n;x++) cout<<num[x]; cout<<"\n The list of Even numbers to be added is \n"; for (int x=0;x<E;x++) cout<<evens[x]; cout<<"\n The list of Odds numbers to be added is \n"; for (int x=0;x<O;x++) cout<<odds[x]; cout<<"\n The Sum of Even numbers is "<<sumE<<endl; cout<<"\n The Sum of Odd numbers is "<<sumO<<endl; }
核心问题分析
- 非标准变长数组(VLA)使用:C++标准不支持
int num[n]这种运行时确定长度的数组,部分编译器虽兼容但会引发未定义行为,N增大时内存问题会暴露。 - evenodd函数数组初始化错误:
int evens[E] , odds[O];中E、O初始值为0,相当于创建了长度为0的空数组,后续赋值操作直接越界访问内存,这是N>3时程序崩溃的根本原因。 - 全局变量滥用:n、E、O作为全局变量,导致函数间耦合过高,状态变化不可控,容易引发逻辑混乱。
- 数组越界访问:在evenodd函数中,往evens[E]、odds[O]赋值时,数组长度为0,每一次赋值都破坏了内存结构,导致程序异常。
修复后的代码
使用C++标准容器std::vector替代原生数组,避免变长数组和越界问题,同时减少全局变量的使用:
#include <iostream> #include <vector> using namespace std; void accept(int n, vector<int>& num); void evenodd(const vector<int>& num, vector<int>& evens, vector<int>& odds); int sumEven(const vector<int>& evens); int sumOdd(const vector<int>& odds); void display(const vector<int>& num, const vector<int>& evens, const vector<int>& odds, int sumE, int sumO); int main() { int n; cout << "Enter How Many Number You Want to Add \n"; cin >> n; vector<int> num; accept(n, num); vector<int> evens, odds; evenodd(num, evens, odds); int sumE = sumEven(evens); int sumO = sumOdd(odds); display(num, evens, odds, sumE, sumO); return 0; } void accept(int n, vector<int>& num) { num.resize(n); for (int x = 0; x < n; x++) { cout << "Enter The Number \n"; cin >> num[x]; } } void evenodd(const vector<int>& num, vector<int>& evens, vector<int>& odds) { for (int x = 0; x < num.size(); x++) { if (num[x] % 2 == 0) { evens.push_back(num[x]); } else { odds.push_back(num[x]); } } } int sumEven(const vector<int>& evens) { int sumE = 0; for (int num : evens) sumE += num; return sumE; } int sumOdd(const vector<int>& odds) { int sumO = 0; for (int num : odds) sumO += num; return sumO; } void display(const vector<int>& num, const vector<int>& evens, const vector<int>& odds, int sumE, int sumO) { cout << "The list of numbers to be added is \n"; for (int x : num) cout << x << " "; cout << "\n The list of Even numbers to be added is \n"; for (int x : evens) cout << x << " "; cout << "\n The list of Odds numbers to be added is \n"; for (int x : odds) cout << x << " "; cout << "\n The Sum of Even numbers is " << sumE << endl; cout << "\n The Sum of Odd numbers is " << sumO << endl; }
修复说明
- 用
std::vector替代原生数组,支持动态扩容,彻底避免数组越界和变长数组的非标准问题。 - 移除全局变量,改为函数参数传递,降低耦合性,逻辑更清晰。
- 使用范围for循环简化代码,提升可读性。
- 调整函数调用流程,将数据的存储和处理分离,符合C++的编程规范。
内容的提问来源于stack exchange,提问作者Santa_Ethiopia
相关产品推荐
相关产品推荐

