cin>>string,和getline(cin,string) 出现的问题

sunjianliang69351992 2008-10-19 11:21:40
code1:cin和getline有冲突
#include<iostream>
#include<string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::getline;
int main()
{
string s1;
string s2;
cin>>s1;
cout<<s1<<endl;
getline(cin,s2,'\n');
cout<<"a";
cout<<s2;
cout<<"b";
return 0;
}

code2:
#include<iostream>
#include<string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::getline;
int main()
{
string s1;
string s2;
getline(cin,s2,'\n'); //交换了getline和cin!就没这个问题了!
cout<<"a";
cout<<s2;
cout<<"b";
cin>>s1;
cout<<s1<<endl;
return 0;
}

高手指点getline的用法!
是不是控制台输入不适合用getline??但是有的时候确实要用到getline的!啊!

讨论!讨论!!!

...全文
888 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
baniao2002 2009-12-05
  • 打赏
  • 举报
回复
与头文件的顺序有关,这样就OK了
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

#include "conio.h"
#include <iostream>
#include <string>
帅得不敢出门 2008-10-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sunjianliang69351992 的回复:]
引用 4 楼 zmlovelx 的回复:
不是getline()的错 而是缓冲区搞的鬼
能不用缓冲曲的层面上解释一下!??
分析getline(cin,string,"\n")和cin>> cou < <之后的缓冲区的变化!
[/Quote]
三楼已经说的很清楚了
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 P_T_P 的回复:]
C/C++ code
#include<iostream>
#include<string>
#include<cstdio>
int main()
{
std::string s1,s2;
std::cin>>s1;
std::cout<<s1<<std::endl;
getchar(); //提取前一个换行符
getline(std::cin,s2,'\n');
std::cout<<s2<<std::endl;
system("pause");
return 0;
}
[/Quote]

那如果cin>>s1后以空格或者tab结束呢?就不管用了!~好像用清空缓冲区cin.sync()最有效啊!
P_T_P 2008-10-19
  • 打赏
  • 举报
回复

#include<iostream>
#include<string>
#include<cstdio>
int main()
{
std::string s1,s2;
std::cin>>s1;
std::cout<<s1<<std::endl;
getchar(); //提取前一个换行符
getline(std::cin,s2,'\n');
std::cout<<s2<<std::endl;
system("pause");
return 0;
}
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zmlovelx 的回复:]
不是getline()的错 而是缓冲区搞的鬼
[/Quote]

能不用缓冲曲的层面上解释一下!??
分析getline(cin,string,"\n")和cin>> cou<<之后的缓冲区的变化!
P_T_P 2008-10-19
  • 打赏
  • 举报
回复
就一个流,怎么会是缓冲区的问题.2楼兄弟说的对!!
帅得不敢出门 2008-10-19
  • 打赏
  • 举报
回复
不是getline()的错 而是缓冲区搞的鬼
weiyifengjing 2008-10-19
  • 打赏
  • 举报
回复
getline():读取整行,它通过回车换行符来确定结尾,但不保留换行符。
cin:试用空白(空格,换行符,tab)来确认字符串结束,并将换行符保留在队列中,如果接下来如果有getline(),看到换行符,将认为是空行,得到的是一个空字串。
get():和getline()类似,但保留换行符,也就是说如果接下来如果有getline(),看到换行符,将认为是空行,得到的是一个空字串
Vegertar 2008-10-19
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::getline;
int main()
{
string s1;
string s2;
cin>>s1;
cout <<s1 <<endl;
//因为上面cin>>s1时缓冲区残留有回车,所以在下面getline时直接结束了.
//解决办法有很多:
//cin.get();(读取回车, 忽略返回值) 或者cin.sync();(清空缓冲) 或者cin.ignore(1); (忽略一个字符)
getline(cin,s2,'\n');
cout <<"a";
cout <<s2;
cout <<"b";
return 0;
}

arong1234 2008-10-19
  • 打赏
  • 举报
回复
标准输入、输出完成一次输入输出后需要刷新缓冲,因为他们是共享缓冲的
cin << fflush;
cout <<fflush;
boys2002 2008-10-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Vegertar 的回复:]
C/C++ code
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::getline;
int main()
{
string s1;
string s2;
cin>>s1;
cout <<s1 <<endl;
//因为上面cin>>s1时缓冲区残留有回车,所以在下面getline时直接结束了.
//解决办法有很多:
//cin.get();(读取回车, 忽略返回值) 或者cin.sync();(清空缓冲) 或者c…
[/Quote]

//dingni

65,211

社区成员

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

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