C++ 接受输入时的分段错误

C++ 接受输入时的分段错误,c++,input,C++,Input,我正在尝试接受用户的输入 其中第一行是整数,表示测试用例的数量 如果数字是3 输入将像 3 Hello world hey there, I am John have a nice day 我正在使用getline读取输入 我的代码 #include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ int n; cin &

我正在尝试接受用户的输入 其中第一行是整数,表示测试用例的数量

如果数字是3

输入将像

3
Hello world
hey there, I am John
have a nice day
我正在使用getline读取输入

我的代码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(){
    int n;
    cin >> n;

    vector<string> arr;

    for(int i=0; i<n; i++){
        string s;
        getline(cin, s);
        arr[i] = s;
    }
}
arr是空向量,因此arr[i]=s;将会进入禁区。[]运算符不会使向量增长。它只能用于访问已经存在的元素。

arr是一个空向量,因此arr[i]=s;将会进入禁区。[]运算符不会使向量增长。它只能用于访问已存在的元素。

不能使用[]索引运算符创建向量的元素;您的线路arr[i]=s;正在尝试将字符串分配给尚不存在的元素

有几种方法可以解决这个问题:首先,可以使用push_back函数在每个循环中向向量的末尾添加一个新元素;其次,您可以使用resize成员预先分配指定数量的元素,然后在arr[i]=s中使用这些元素;线第三,也可能是最简单的,您可以通过在声明构造函数中指定元素的数量来“预分配”向量的元素,如下所示:

包括 包括 包含和此处给出的优秀答案以了解更多详细信息。

您不能使用[]索引运算符创建向量的元素;您的线路arr[i]=s;正在尝试将字符串分配给尚不存在的元素

有几种方法可以解决这个问题:首先,可以使用push_back函数在每个循环中向向量的末尾添加一个新元素;其次,您可以使用resize成员预先分配指定数量的元素,然后在arr[i]=s中使用这些元素;线第三,也可能是最简单的,您可以通过在声明构造函数中指定元素的数量来“预分配”向量的元素,如下所示:

包括 包括
更多详细信息,请包括和给出的优秀答案。

arr[i]=s;但是arr是空的,因此它没有ith元素。如果您想插入,可以使用或。@AlgirdasPreidžius谢谢!!这是我的助手犯的愚蠢的错误;但是arr是空的,因此它没有ith元素。如果您想插入,可以使用或。@AlgirdasPreidžius谢谢!!我犯了一个愚蠢的错误。你能详细解释一下吗如果没有这个,cin流中会有剩余的换行符吗?我想这就是为什么我只能读两行而不是一行3@Sociopath请参阅我在编辑中链接的Q/A-我无法真正改进这些帖子。感谢您的回答并指出其他优化:-您可以使用保留成员预先分配指定数量的元素,然后在arr[I]中使用这些元素不,那是错的。reserve只分配内存,这样向量就不必在每次加法时这样做。它不使arr[I]=s;有效-它不改变大小,只改变容量。您无法访问纯保留的内存。您可能想说resize,它改变了向量的大小和容量。保留只会改变容量。@JesperJuhl的确-我错了!现在编辑为建议调整大小而不是保留。您能否详细说明cin.ignore1;//如果没有这个,cin流中会有剩余的换行符吗?我想这就是为什么我只能读两行而不是一行3@Sociopath请参阅我在编辑中链接的Q/A-我无法真正改进这些帖子。感谢您的回答并指出其他优化:-您可以使用保留成员预先分配指定数量的元素,然后在arr[I]中使用这些元素不,那是错的。reserve只分配内存,这样向量就不必在每次加法时这样做。它不使arr[I]=s;有效-它不改变大小,只改变容量。您无法访问纯保留的内存。您可能想说resize,它改变了向量的大小和容量。保留只会改变容量。@JesperJuhl的确-我错了!现在编辑为建议调整大小而不是保留。
3 

Segmentation fault(core dumped)