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

C++中通过用户输入函数替换vector元素及程序异常问题

C++向量输入函数问题修复

问题描述

  • 调用InputNumbers()后,无法用用户输入替换numVect的元素,尝试在函数内创建新vector并赋值给numVect失败
  • 执行InputNumbers()时,输入第一个元素后终端直接停止运行

问题原因

  1. 值传递导致原vector未更新:InputNumbers()的参数是vector<int> numVect,属于值传递,函数内操作的是原vector的副本,且返回的新vector没有赋值给主函数中的numVect,原容器内容不会改变。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:41:29