6

如果我使用以下代码,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;
    }
}

为了摆脱它,我将 cin.ignore() 放在 getline 之后。现在它接受所有输入,但我面临一个新问题 -

#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;
    }
}

新问题是,在使用 c2 时,字符串的第一个字符会被删除。例如,如果我将“England Jane Doe”作为 getline 的输入,在 c2 中我将得到“ngland”。

现在如何摆脱这个问题?

4

4 回答 4

16

这:

cin>>n;

只是读取数字。
它在流中留下尾随'\n'

所以你的第一个电话getline()是读取一个空行,其中只包含一个'\n'

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

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

 int n;
 std::stringstream numberline(number);
 numberline >> n;
于 2012-04-17T22:17:09.827 回答
2

cin.ignore()在错误的地方。getline 不会留下尾随的\n换行符,它是执行此操作的>>符号。

你可能想要的是

cin>>n;
cin.ignore();
于 2012-04-17T22:21:00.803 回答
1

实际上 cin 缓冲区从最后一个 cin 中剩下了 \n,所以 getline 取这个 \n 字符并被终止;在getline之前忽略缓冲区的内容...

cin.ignore();

getling(cin, string_name);

//它会顺利运行

于 2014-11-02T11:32:13.797 回答
0

写吧

cin.ignore();

在您最后一个“>>”运算符之后。“>>”运算符在输入比特流中留下一个换行符“\n”,在输入之前需要清除它。

于 2014-06-22T06:23:32.843 回答