C ++:当尝试在单个for循环中使用getlline()填充多个向量时,向量下标超出范围

问题描述 投票:0回答:3

当我尝试运行此代码时:

vector <string> names;
vector <string> telephones;
vector <string> emails;

for (int i = 0; i < 5;i++) {
    cout << "enter name" << '\n';
    getline(cin, names[i]);

    cout << "enter telephone number" << '\n';
    getline(cin, telephones[i]);

    cout << "enter email address" << '\n';
    getline(cin, emails[i]);
}

它编译得很好但是当我尝试运行它时,我得到“向量下标超出范围”错误消​​息。

c++ vector range
3个回答
2
投票

请定义向量的大小,因为仅定义向量不会为它们分配内存。

vector <string> names(5);
vector <string> telephones(5);
vector <string> emails(5);

for (int i = 0; i < 5;i++) {
    cout << "enter name" << '\n';
    getline(cin, names[i]);

    cout << "enter telephone number" << '\n';
    getline(cin, telephones[i]);

    cout << "enter email address" << '\n';
    getline(cin, emails[i]);
}

1
投票

使用任何push或emplace函数,您的矢量都不会被赋予起始大小或增加大小。在导致分配存储之前,不能使用[]

cout << "enter name" << '\n';
string temp;
getline(cin, temp);
names.push_back(temp);

等等......一试。

不要使用一个数据的三个数组,而是考虑制作一个结构

struct person
{
    string name;
    string telephone;
    string email
};

然后是这个结构的单个矢量。

vector<person> people;

这使您能够创建一个函数,在一个裂缝中读取整个人,使得主循环逻辑更加简单,并且如果您将来向person添加更多数据,则需要更少的维护。

person getPerson()
{
    person temp;
    cout << "enter name" << '\n';
    getline(cin, temp.name);

    cout << "enter telephone number" << '\n';
    getline(cin, temp.telephone);

    cout << "enter email address" << '\n';
    getline(cin, temp.email);
    return temp;
}

然后

for (int i = 0; i < 5;i++) {
    people.push_back(getPerson());
}

0
投票

你不能直接在向量中输入。因为当你运行getline(cin,name [i])时,这个向量中没有分配'i'索引。有两种可能的解决方案。

解决方案1,首先分配所有索引:

vector <string> names;
vector <string> telephones;
vector <string> emails;
name.resize(5);
telephones.resize(5);
emails.resize(5);

for (int i = 0; i < 5;i++) {
    cout << "enter name" << '\n';
    getline(cin, names[i]);

    cout << "enter telephone number" << '\n';
    getline(cin, telephones[i]);

    cout << "enter email address" << '\n';
    getline(cin, emails[i]);
}

解决方案2,在运行时创建索引:

vector <string> names;
vector <string> telephones;
vector <string> emails;

for (int i = 0; i < 5;i++) {
    string temp;
    cout << "enter name" << '\n';
    getline(cin, temp);
    name.push_back(temp);

    cout << "enter telephone number" << '\n';
    getline(cin, temp);
    telephones.push_back(temp);

    cout << "enter email address" << '\n';
    getline(cin, temp);
    emails.push_back(temp);
}
© www.soinside.com 2019 - 2024. All rights reserved.