C++中cin的输入问题

#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+回车),改如何实现

语句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+回车 等等

不过还是得谢谢你的代码哈!

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-08
这个还真不太容易说明白,因为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;
}
第2个回答  2013-04-08
很简单的啊,不管你一次输入多少,先送到输入流缓冲区里,然后后面的语句继续执行,当有读入的语句时,它先看缓冲区有木有!有就直接读取了,继续执行下面的语句,所以你的结果也是情理之中的。一般我们用cin.ingnore(std::numberic_limits<std::streamsize>::max(),'\n')清除缓冲区。
第3个回答  2013-04-08
cin输入流会暂存的,原程序有两个cin你输入1+空格2的时候会会把1,2分别存入a和b,如果只有一个cin>>a;则会输出1;至于报错的事儿,其实也没必要

c++用cin输入数组问题
只能先用一行输入a,再用一行输入b[a]——因为cin是从右边开始压栈的,就是先压b[a]再压a,显然压b[a]时还不知道a是多少,后面输入了a,但改变不了已经压栈了的内容。就是说这种情况一定要保证操作b[a]时a必须是已知的。但这种东西与编译器关系很大,也许后来的编译器异想天开,弄个别致的...

关于C++中cin的几个问题
1.cin.getline是读入一行字符,比如:include <iostream.h> void main(){ char str[20];cout<<"Input :";cin.getline(str,20);cout<<str<<endl;} 当输入:abd cdrasdf g的时候就会输出:abd cdrasdf g。2.cin.get()第一个用法,是读入一个字符。include <iostream.h> void main(){ cha...

关于C++输入cin的问题,下面的程序,如果输入的不合法,那就将陷入死循环...
例如你输入的数据为a,然后回车,此时输入缓冲区中就有两个字符,一个是‘a’,一个是回车换行符‘\/n’,接着程序读取,由于类型不匹配,读取失败,并没有读走输入缓冲区中的数据,也就是说,此时输入缓冲区中还是‘a’,和‘\\n’,

c++用cin输入字符问题
cin这是输入函数,cout才是输出。可以改为:cout<<"("<<x<<","<<y<<")";如果你不要小括号就是:cout<<x<<","<<y;希望对你有帮助...

c++中有关cin的问题
value 是int型变量,按下Enter键时,由于读入错误类型值,导致输入流cin的状态变为不可用,于是退出循环。cin的几种状态:cin.eof()cin.bad()cin.fail()cin.good()当前三者 cin.eof() & cin.eof() & cin.fail() 为0时,此时cin.good() 为1,否则cin.good()为0 楼上提到的返回类型为void...

C++ cin输入格式的问题
很简单,你想在输入x y时用逗号分隔,那么其实输进电脑的是三个值,这三个值分别为"x",",","y",此时就要再定义一个字符型变量。main函数如下:int main(){ double x,y;char c;cin>>x>>c>>y;if(fabs(x*x+y*y-1)<0.001) cout<<"Y"<<endl;else cout<<"N"<<endl;return...

C++使用cin时,如果输入字符为什么出现-85899346?
输入数据类型与cin>>指定的类型不一致 (比如你这里定义一个整型变量,但程序启动后却塞给它字符型的数据)会导致cin调用 矢败,cin不再从缓冲区读取数据 ,后面所有试图用cin赋值的变量都会保留原值.你这里说的这个-85899346应该是 定义整型变量没有初始化而保留的原值吧....

c++编程问题 (关于cin的)
第一个cin是用户第一次输入的值,但是你要统计用户输入的正负的个数,那必然是输入多个值。所以在while循环里面的末尾添加cin的作用就是 用户以后输入的值了,知道用户输入0则停止。在while里cin>>n n的值就改变了,那么while()就会触发,进而判断是否满足条件。第二个cin是不指定次数循环进行的必要...

C++ 简单cin问题
cin >> x >> y >> z >>endl;把后面的endl去掉就行了,换行符是输出控制的,你总不能输入一个换行符吧

为什么c++中 cin>>x>>y;是正确,cin>>x, y;是不正确的?说的深奥点,为什 ...
因为cin是以流的方式输入输出的,而不是用参数

相似回答