C++中cin的输入问题

#include<iostream>usingnamespacestd;intmain(){inta=0,b=0;cin>>a;//语句1cout<<a;//语句2cin... #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+回车),改如何实现
展开
 我来答
yanjianming05
推荐于2017-09-12 · 超过33用户采纳过TA的回答
知道答主
回答量:121
采纳率:100%
帮助的人:25.1万
展开全部

语句3执行了,1+空格+2+回车,则1、2两个整数都进入缓冲区,不是12.

你可以输出一个换行就清楚了。

#include<iostream>
using namespace std;
int main()
{
int a=0,b=0;
cin >>a; //语句1
cout <<a<<endl; //语句2
cin >>b; //语句3
cout <<b<<endl; //语句4
return 0;
}

判断合法性,如下:

#include<iostream>
using namespace std;
bool IsInteger(char *str)
{
if(*str=='\0')
{
return false;
}
while(*str!='\0')/*如果字符串结束就跳出while循环*/
{
if((*str<'0')||(*str>'9'))/*判断字符是否是0-9以外的字符,是就返回false*/
return false;
str++;/*字符地址加1,这样下次*str里就是下一个字符了*/
}
return true;/*如果没有数字以外的字符,证明这个字符串是一个整型,就返回true*/
}
int main()
{
int a=0,b=0;
char str[50];
gets(str);
while(!IsInteger(str))
{
cout<<"非法输入,只能输入一个整数,请重新输入:";
gets(str);
}
a=atoi(str);
//cin >>a; //语句1
cout <<a<<endl; //语句2
cin >>b; //语句3
cout <<b<<endl; //语句4
return 0;
}
追问
哈哈,这个问题终于搞清楚了。而且我昨晚突发灵感终于想出个简洁的方法,只需几个语句就可以判断是不是整数
bool Is_Input_Int( )
{
int a;
cin.clear();

cin.sync();

cin >>a;

if( !cin||getchar()!='\n' ) return false;

else return true;

}
这个函数可以检出一切无厘头输入,包括12abc,1a2bc,0.123,1+空格+2+回车 等等

不过还是得谢谢你的代码哈!
xzhw8608
2013-04-08 · TA获得超过1779个赞
知道小有建树答主
回答量:1074
采纳率:100%
帮助的人:575万
展开全部
这个还真不太容易说明白,因为C++使用流这个东西,cin是一个流对象,接收终端的输入遇到回车结束
然后终端的输入都存入到cin对象里
然后通过重载的运算符>>将存储的内容存储到变量里,但是默认按空格结束,其实你可以修改结束标志的

那么分析你cin的过程,输入1 空格 2,流里存入了1空格2
然后cin>>a,将1传给了a,遇到了空格,结束,但是此时cin并没有空.
cout << a,输出了1
然后继续cin>>b,因为cin里还有一个2存在,所以,b也得到了2

cout << b,就又输出2了

我也改一个判断输入的吧
#include<iostream>
using namespace std;
int main()
{
int a=0,b=0;
char c;

while((c=cin.get()) != ' ' && c >= '0' && c <= '9')
{
a = a*10 + (c - '0');

}

//语句1
cout <<a; //语句2
//cin >>b; //语句3
while((c=cin.get()) != ' ' && c >= '0' && c <= '9')
{
b = b*10 + (c - '0');
}

cout <<b; //语句4

return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sslinlin11
2013-04-08 · TA获得超过156个赞
知道答主
回答量:43
采纳率:0%
帮助的人:16万
展开全部
很简单的啊,不管你一次输入多少,先送到输入流缓冲区里,然后后面的语句继续执行,当有读入的语句时,它先看缓冲区有木有!有就直接读取了,继续执行下面的语句,所以你的结果也是情理之中的。一般我们用cin.ingnore(std::numberic_limits<std::streamsize>::max(),'\n')清除缓冲区。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
遁世千秋
2013-04-08
知道答主
回答量:36
采纳率:0%
帮助的人:24.7万
展开全部
cin输入流会暂存的,原程序有两个cin你输入1+空格2的时候会会把1,2分别存入a和b,如果只有一个cin>>a;则会输出1;至于报错的事儿,其实也没必要
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式