getline(cin,str)的奇怪输出

时间:2018-10-07 13:03:55

标签: c++ string getline

在下面给出的代码中,我试图从cin中获取字符串输入,但是它显示了一些运行时错误。

int main(){

int t;
cin>>t;
while(t--){
    string s,pat;
    cin>>s>>pat;
    int q;
    cin>>q;
     vector<pair<int,char> > queries;
    for(int i=0;i<q;i++){
        cin>>queries[i].first;
        cin>>queries[i].second;
    }
    cout<<s<<endl;
    cout<<pat<<endl;
}
return 0;}

所以我用getline而不是像cin这样的cin:

getline(cin,s);
getline(cin,pat);

它显示了类似的输出

abcde

输入

2 abcde bc 3 0 p 1 q 2 w wxyz cde 2 0 t 1 z

所以在我看来,getline在t之后占用空间,该空间存储在第一个测试用例的字符串s中,而第一个字符串(即“ abcde”)存储在字符串pat中,我不知道为什么它显示为空第二个测试用例的行。

所以要摆脱t之后的多余空间,我添加了一个额外的字符串来存储该空间,就像:

int main(){
int t;
cin>>t;
string z;
getline(cin,z);
while(t--){
    string s;
    getline(cin,s);
    string pat;
    getline(cin,pat);
    cout<<s<<endl;
    cout<<pat<<endl;
}
return 0;

}

它适用于输入

2 abcde bc wxyz cde

但是当我添加此代码

string s,pat;
    getline(cin,s);
    getline(cin,pat);
    int q;
    cin>>q;
    vector<pair<int,char> > queries;
    for(int i=0;i<q;i++){
        cin>>queries[i].first;
        cin>>queries[i].second;
    }

它显示运行时错误。请帮忙。

1 个答案:

答案 0 :(得分:0)

这将解决您遇到的问题。正如上面的评论中提到的,您有一个空向量,并且正在尝试访问该向量的元素。您需要创建一对,然后将其推入向量中:

for(int i=0;i<q;i++){
    int v;
    char c;
    cin>> v >> c;
    queries.push_back(make_pair(v, c));
}

要进一步说明实际问题是什么,可以将向量视为壁橱,您可以在壁橱中放置一系列盒子。将每个盒子放在壁橱中时,会分配一个编号(索引)。除非您在壁橱中放置一个盒子,否则壁橱是空的。它具有存储箱子的潜力,但是那里没有箱子。当您编写queries[i]行时,您实际上是在走到壁橱里,寻找一个带有特定索引的盒子,然后试图在其中放一些东西。但是,在您的情况下,您所拥有的只是一个空壁橱,因此当您尝试将某些东西放入盒子(例如,盒子编号0)时,找不到盒子,并且您收到此运行时错误。为了要求一个带有特定索引的盒子,它必须存在并且在壁橱中。我所做的代码更改是实际创建盒子,然后将其放入壁橱中。