如果我使用下面的代码,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;
}
}
为了摆脱它,我在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;
}
}
新问题是,在使用c2时,字符串的第一个字符会被删除。例如,如果我将“England Jane Doe”作为getline的输入,那么在c2中我将获得“ngland”。
现在如何摆脱这个问题?
答案 0 :(得分:12)
此:
cin>>n;
仅读取数字。
它会在流上留下尾随'\n'
。
因此,您第一次致电getline()
时,正在读取一条仅包含'\n'
最好不要混用operator>>
和std::getline()
。你必须非常小心是否在流上留下了换行符。我发现最容易从用户那里一次读取一行。然后分别解析该行。
std::string numnber;
std::getline(std::cin, number);
int n;
std::stringstream numberline(number);
numberline >> n;
答案 1 :(得分:2)
您的cin.ignore()
位置错误。 getline不会留下尾随的\n
换行符,它是执行该操作的>>
符号。
你可能想要的是
cin>>n;
cin.ignore();
答案 2 :(得分:0)
写一下
cin.ignore();
在你的最后一个“&gt;&gt;”之后运营商。 “&GT;&gt;” 中运算符在输入比特流中留下一个换行符“\ n”,需要在输入之前将其清除。
答案 3 :(得分:0)
实际上,cin缓冲区已从最后一个cin中删除, 所以getline取这个\ n字符并被终止; 在getline之前忽略缓冲区的内容......
cin.ignore();
getling(cin,string_name);
//它会顺利运作