为何getline第一次循环不会读入字符

乐百川 2014-04-19 10:37:22
OJ上面有一道题,输入是
第一行是一个正整数N,最大为100。之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000。
输出是
先将输入中的前N行字符串(可能含有空格)原样输出,再将余下的字符串(不含有空格)以空格或回车分割依次按行输出。每行输出之间输出一个空行。
Sample Input
2
www.njupt.edu.cn NUPT
A C M
N U P Ter
Sample Output
www.njupt.edu.cn NUPT
A C M
N
U
P
Ter
然后我就想当然的写了下面这段
# include <iostream>
# include <string>
# include <sstream>
usingnamespacestd;
intmain()
{
intn;
string str;
string line;
cin >> n;
for(inti = 0; i < n; ++i)
{
getline(cin, line);
cout << line << endl;
}
while(cin >> line)
{
istringstream in(line);
while(!in.eof())
{
in >> str;
cout << str << endl;
}
}
}

但是输出结果不对呀,第一个for循环第一次啥也没干,第二次输出第一行的内容,然后下面的就都拆开了,请问这是什么原因,求指教啊!!!!
...全文
451 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
AdairJun 2014-04-20
  • 打赏
  • 举报
回复 1
我上面写错了, 不是str,而是line.我习惯用str,一下没改过来
AdairJun 2014-04-20
  • 打赏
  • 举报
回复
当执行到getline(cin,line)的时候就开始往输入缓冲区输入数据了,其中我键盘输入的内容都被送入str中。当第二次执行到getline()的时候,输入缓冲区内还有内容,故继续读取缓冲区的内容到c。 在getline(cin,line')之前加一条刷新一下输入缓冲区的语句,我用的是cin.sync(),那么在getline()的时候你就可以再从键盘输入数据到输入缓冲区了。
乐百川 2014-04-20
  • 打赏
  • 举报
回复
引用 3 楼 u014120684 的回复:
当执行到getline(cin,line)的时候就开始往输入缓冲区输入数据了,其中我键盘输入的内容都被送入str中。当第二次执行到getline()的时候,输入缓冲区内还有内容,故继续读取缓冲区的内容到c。 在getline(cin,line')之前加一条刷新一下输入缓冲区的语句,我用的是cin.sync(),那么在getline()的时候你就可以再从键盘输入数据到输入缓冲区了。
我不太懂,就是第一次getline会读取缓冲区里面的前面输入的n是吗,所以得先刷新一下缓冲区才能正确的读入字符,是这个意思么
乐百川 2014-04-20
  • 打赏
  • 举报
回复
引用 1 楼 u014120684 的回复:
有没有使用cin.sync()这条语句刷新缓冲区,不刷新缓冲区的话getline()无效的
好的,真的可以啊,请问为什么呢
乐百川 2014-04-20
  • 打赏
  • 举报
回复
引用 6 楼 u014120684 的回复:
是的,正是如此
好的,我明白了,万分感谢!!!!
AdairJun 2014-04-20
  • 打赏
  • 举报
回复
是的,正是如此
AdairJun 2014-04-19
  • 打赏
  • 举报
回复
有没有使用cin.sync()这条语句刷新缓冲区,不刷新缓冲区的话getline()无效的

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧