首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++:尝试在单个for循环中使用getlline()填充多个向量时,向量下标超出范围

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

Stack Overflow用户
提问于 2019-02-11 14:34:01
回答 3查看 49关注 0票数 0

当我尝试运行这段代码时:

代码语言:javascript
运行
复制
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]);
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-11 14:38:03

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

代码语言:javascript
运行
复制
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]);
}
票数 2
EN

Stack Overflow用户

发布于 2019-02-11 14:38:13

任何push或emplace函数都不会为您的向量指定起始大小或增加大小。在分配存储之前,您不能使用[]

代码语言:javascript
运行
复制
cout << "enter name" << '\n';
string temp;
getline(cin, temp);
names.push_back(temp);

等等。试一试。

附注:

与其让一段数据有三个数组,不如考虑构造一个结构

代码语言:javascript
运行
复制
struct person
{
    string name;
    string telephone;
    string email
};

然后是这个结构的一个向量。

代码语言:javascript
运行
复制
vector<person> people;

这会让你创建一个在一次破解中读取整个人的函数,使得主循环逻辑变得更简单,并且如果你将来向person添加更多的数据,需要更少的维护。

代码语言:javascript
运行
复制
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;
}

然后

代码语言:javascript
运行
复制
for (int i = 0; i < 5;i++) {
    people.push_back(getPerson());
}
票数 1
EN

Stack Overflow用户

发布于 2019-02-11 14:42:46

你不能直接接受向量中的输入。因为当您运行getline(cin,namei)时,此向量中没有分配的'i‘索引。有两种可能的解决方案。

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

代码语言:javascript
运行
复制
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,在运行时创建索引:

代码语言:javascript
运行
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54625067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档