C++中通过用户输入函数替换vector元素及程序异常问题
C++向量输入函数问题修复
问题描述
- 调用
InputNumbers()后,无法用用户输入替换numVect的元素,尝试在函数内创建新vector并赋值给numVect失败 - 执行
InputNumbers()时,输入第一个元素后终端直接停止运行
问题原因
- 值传递导致原vector未更新:
InputNumbers()的参数是vector<int> numVect,属于值传递,函数内操作的是原vector的副本,且返回的新vector没有赋值给主函数中的numVect,原容器内容不会改变。 - vector越界触发未定义行为:
numVect2初始化为空vector,直接通过numVect2[i]访问元素会越界,导致程序崩溃或异常终止。
修复方案
方案1:用引用参数直接修改原vector
修改InputNumbers()的参数为引用类型,直接操作传入的vector,无需返回新容器:
#include <iostream> #include <vector> using namespace std; void InputNumbers(vector<int>& numVect) { cout << "Input 5 numbers into a vector: " << endl; for (int i = 0; i < 5; i++) { cin >> numVect[i]; } } void OutputNumbers(vector<int> numVect) { cout << "Vector: " << endl; for (auto i : numVect) { cout << i << " "; } cout << endl; } int main() { vector<int> numVect = {4, 5, 6, 7, 8}; enum menu {Input = 1, Row = 2, Stack = 3, Twostacks = 4, Numbers = 5}; int choice; do { cout << "1. Input numbers\n"; cout << "2. Row\n"; cout << "3. Stack\n"; cout << "4. Two stacks\n"; cout << "5. Output numbers\n"; cout << "6. End\n"; cout << "--------------------------\n"; cout << "Choice: "; cin >> choice; cout << endl; switch (choice) { case Input: InputNumbers(numVect); break; case Numbers: OutputNumbers(numVect); break; } } while (choice != 6); return 0; }
方案2:正确创建新vector并赋值给原变量
如果需要创建新vector返回,先初始化容器大小或用push_back()动态添加元素,同时在主函数中接收返回值并赋值:
#include <iostream> #include <vector> using namespace std; vector<int> InputNumbers() { vector<int> numVect2(5); // 初始化大小为5 cout << "Input 5 numbers into a vector: " << endl; for (int i = 0; i < 5; i++) { cin >> numVect2[i]; } return numVect2; } void OutputNumbers(vector<int> numVect) { cout << "Vector: " << endl; for (auto i : numVect) { cout << i << " "; } cout << endl; } int main() { vector<int> numVect = {4, 5, 6, 7, 8}; enum menu {Input = 1, Row = 2, Stack = 3, Twostacks = 4, Numbers = 5}; int choice; do { cout << "1. Input numbers\n"; cout << "2. Row\n"; cout << "3. Stack\n"; cout << "4. Two stacks\n"; cout << "5. Output numbers\n"; cout << "6. End\n"; cout << "--------------------------\n"; cout << "Choice: "; cin >> choice; cout << endl; switch (choice) { case Input: numVect = InputNumbers(); break; // 接收返回值赋值 case Numbers: OutputNumbers(numVect); break; } } while (choice != 6); return 0; }
说明
- 方案1更高效,避免vector拷贝;方案2适合需要保留原vector的场景。
- 访问vector元素前,确保容器有足够大小,或用
push_back()动态添加元素,避免越界。
内容的提问来源于stack exchange,提问作者levaldssandis
相关产品推荐
相关产品推荐

