C++中cin的输入问题

三叶橄榄 2013-04-08 09:05:46
#include<iostream>
using namespace std;
int main()
{
int a=0,b=0;
cin >>a; //语句1
cout <<a; ​//语句2
cin >>b; ​//语句3
cout <<b; ​//语句4
return 0;
}

如果输入1,按回车显示1;然后再输入2,按回车显示2,这个正常

但现在问题是,在输入界面,如果按1,然后按空格,再按2,最后按回车,结果是输出12!

请问这个内部机制是如何实现的?在语句1本来应该只输入一个int型数然后按回车,把a显示出来,但现在我是按了1+空格+2+回车,那么是不是1和2都被储存在了cin的缓冲区?换句话说为什么语句3没有执行(没有让用户输入b的值)?执行完语句2之后,语句3究竟有没有执行?

望大神做详细解释!!!还有如果我要设置一个报错功能,就是在cin>>a;时,用户只能输入一个int型数,其它一切任何输入都将报错(当然包括输入1+空格+2+回车),改如何实现?
...全文
441 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxx0527 2013-04-10
  • 打赏
  • 举报
回复
引用 2 楼 Achilles_Hell 的回复:
引用 1 楼 u010190692 的回复:输出的不是12,是1和2,只是连在一起了 把cout <<a; 改成cout <<a<<endl;就知道了 谁不知道输出的12是1和2连在一起这么显而易见的东西还说出来,哥们你是菜鸟么 哥们,拜托先看清楚我要问的重点,别什么都没搞清楚就急着评论 你这回答都文不对题的
兄弟,这位高手回答得是正确的,你输入1+空格+2+回车后是不是程序一下运行结束了?,而只输入1时还在等你输入?这就是他说的意思,还有如果你不确定的话,在cout << a;后先清空缓冲区,然后再cin >> b;你会发现正常了。。。
yongtaimen 2013-04-09
  • 打赏
  • 举报
回复
输入1没有回车证明第一次输入还没结束。。。
c_c_yuan 2013-04-09
  • 打赏
  • 举报
回复
输入输出流不是那么好控制的,都不支持更改pos位置的。你可以考虑使用 istream& getline (char* s, streamsize n ); 读入一行字符,然后自己解析这行字符串吧。
半醉看夕阳 2013-04-09
  • 打赏
  • 举报
回复
要是不输出12就出问题了
赵4老师 2013-04-09
  • 打赏
  • 举报
回复
单步调试和设断点调试是程序员必须掌握的技能之一。
有新工作否 2013-04-09
  • 打赏
  • 举报
回复
引用 3 楼 vipxuliang 的回复:
百度百科:引用cin是istream类的对象,它是从标准输入设备(键盘)获取数据,程序中的变量通过流提取符">>"从流中提 取数据。流提取符">>"从流中提取数据时跳过输入流中的空格、tab键、换行符等空白字符。注意:只有在输入完数据再按回车键后,该行数据才被送入键盘缓存区,形成输入流,提取运算符">>"才能从中提取数据。需要注意保证从流中读取数据能正常运行。 所……
厉害
Infinta8 2013-04-08
  • 打赏
  • 举报
回复
引用 2 楼 Achilles_Hell 的回复:
引用 1 楼 u010190692 的回复:输出的不是12,是1和2,只是连在一起了 把cout <<a; 改成cout <<a<<endl;就知道了 谁不知道输出的12是1和2连在一起这么显而易见的东西还说出来,哥们你是菜鸟么 哥们,拜托先看清楚我要问的重点,别什么都没搞清楚就急着评论 你这回答都文不对题的
1) cin>>a和cin>>b是在输入流里面提取数据,cin>>a遇到空格结束,空格后面的2传给b 就是1存在a,2存在b 2)cin内部会进行判断,a是int就只能输入int型,否则cin失败 3)直接判断a,b值有没变就能知道成功与否 要是这样回答你没能理解,兄弟,多看看书吧……
Lionheartch 2013-04-08
  • 打赏
  • 举报
回复
百度百科:
引用
cin是istream类的对象,它是从标准输入设备(键盘)获取数据,程序中的变量通过流提取符">>"从流中提 取数据。流提取符">>"从流中提取数据时跳过输入流中的空格、tab键、换行符等空白字符。注意:只有在输入完数据再按回车键后,该行数据才被送入键盘缓存区,形成输入流,提取运算符">>"才能从中提取数据。需要注意保证从流中读取数据能正常运行
。 所以键盘输入1 2后这两个数被存在键盘的缓存区,cin>>a和cin>>b依次从缓存读取一个int型的值。 而如果只第一次只输入一个数字1的话那么这个1在cin>>a的时候就被读走, 运行到cin>>b时缓存区没有数据,就会等待键盘输入。 你可以单步运行试试就知道了。
三叶橄榄 2013-04-08
  • 打赏
  • 举报
回复
引用 1 楼 u010190692 的回复:
输出的不是12,是1和2,只是连在一起了 把cout <<a; 改成cout <<a<<endl;就知道了
谁不知道输出的12是1和2连在一起这么显而易见的东西还说出来,哥们你是菜鸟么 哥们,拜托先看清楚我要问的重点,别什么都没搞清楚就急着评论 你这回答都文不对题的
Infinta8 2013-04-08
  • 打赏
  • 举报
回复
输出的不是12,是1和2,只是连在一起了 把cout <<a; 改成cout <<a<<endl;就知道了

64,637

社区成员

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

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