cin.getline()正在跳过C++中的输入

the*_*est 5 c++ string cin getline

如果我使用下面的代码,getline不会接受最后一个输入(对于"for"循环的最后一次迭代,它只是跳过它) -

int main()
{
    int n;
    map<string, set<string> > lst;
    string c,s,c2;

    cin>>n;

    for(int i=0;i<n;i++)
    {
            getline(cin,c); // here it skips the input for last iteration
            stringstream ss;
            ss<<c;

            bool f=1;
            while(ss>>s)
            {
                        if(f)
                        {
                             c2=s;
                             f=0;
                        }
                        else
                             lst[c2].insert(s);           
            }
    }

    for (map<string, set<string> >::const_iterator ci = lst.begin(); ci != lst.end(); ++ci)
    {
                cout<< (*ci).first <<" "<< (*ci).second.size() <<endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

为了摆脱它,我在getline之后放了cin.ignore().现在它采取了所有的投入,但我正面临一个新的问题 -

#include<iostream>
#include<string>
#include<map>
#include<set>
#include<sstream>
#include<algorithm>

using namespace std;

int main()
{
    int n;
    map<string, set<string> > lst;
    string c,s,c2;

    cin>>n;

    for(int i=0;i<n;i++)
    {
            getline(cin,c);
            cin.ignore();
            stringstream ss;
            ss<<c;

            bool f=1;
            while(ss>>s)
            {
                        if(f)
                        {
                             c2=s;
                             f=0;
                        }
                        else
                             lst[c2].insert(s);           
            }
    }

    for (map<string, set<string> >::const_iterator ci = lst.begin(); ci != lst.end(); ++ci)
    {
                cout<< (*ci).first <<" "<< (*ci).second.size() <<endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

新问题是,在获取c2时,字符串的第一个字符将被删除.例如,如果我将"England Jane Doe"作为getline的输入,那么在c2中我将获得"ngland".

现在如何摆脱这个问题?

Mar*_*ork 12

这个:

cin>>n;
Run Code Online (Sandbox Code Playgroud)

只读数字.
'\n'在流上留下尾随.

所以你的第一个电话getline()就是读一个只包含a的空行'\n'

最好不要混合使用operator>>std::getline().你必须非常小心是否在流上留下了换行符.我发现最容易从用户那里一次读取一行.然后分别解析该行.

 std::string  numnber;
 std::getline(std::cin, number);

 int n;
 std::stringstream numberline(number);
 numberline >> n;
Run Code Online (Sandbox Code Playgroud)