关于cin和流的一个问题

来源:百度知道 编辑:UC知道 时间:2024/06/30 19:00:42
#include<iostream.h>
void main()
{int a,b,c;
cin>>a>>b;
c=a+b;
cout<<c;
}
我输入:1a 2b或者1a
最后C的结果都是1呢
是a被排除了吗 cin是怎么取值的呢
另外
#include<iostream.h>
void main()
{int i,s;
cout<<"输入一个整数";
cin>>i;
s=cin.rdstate();-----A
cout<<"s="<<s<<'\n';
while(s){
cin.clear();----B
---------C
cout<<"非法的输入,重新输入一个整数";
cin>>i;--------D
s=cin.rdstate();
}
cout<<"num="<<i<<'\n';
}
}
以上程序我输入1a 最后num值显示为1
但输入a1就死循环
书上说要在c处加上cin.getline(str,80)
原话是这么说的:
因为从输入流中提取整数时,发现是字符或字符串,则不从缓冲区中提取字符,仅设置非法输入/输出操作错误。A行得到的S值为2.
尽管在whlie循环中清除了错误的状态位(B处),但并没有清除输入流中仍在缓冲区中的字符或字符串。执行D行时,又从缓冲区提取整数,发现是字符或字符串,则不提取字符仅置错误状态标志。这必然导致输入流不能正常工作,而产生死循环。

来个高手具体解释下,说的明白点,实在看不懂书上的话~~~

cin函数的类型不匹配的话,只会设置流的错误标志,是不会取出流中的数据的。第一个问题中的b你就相当于cin函数根本没有给他赋值,那么他的值是什么就是不可预知的事情了。
第二个问题,当时输a1时,cin>>i,会导致一个错误,i为整型,不能读入数据。所以此时流的状态会是错误,但是流中的数据a1还在。s=cin.rdstate(); cout<<"s="<<s<<'\n'; 这里为什么会得到2值我想就不用解释了,因为s>=1,所以会进入While循环,B处cin.clear()的意思是设置流的状态为正常,但执行至D处时,类型不匹配的情况再次发生,i不会在D处做任何赋值操作的,流的状态再一次被设置为错误状态。s=2,导致了While循环再一次的条件满足,所以它不能退出,也就死循环了。应该明白了吧?
这里我还要说明一点的是,如果流的状态为错误,那么所有的cin执行的时候都会直接返回的。

如果你非要简单点的 就这样说
你定义的变量是驴头 写进去的(就是a b)是马嘴
不符合 如果真的要输入1a的话
把int改成chart 然后1a+2b就会等于1a2b
否则就别输入1a 1a是一个字符组合而成的一个串(称字符串)而不是整数(称整型)类型了
第二个问题同理

第一个问题
是你定义 了一个int型的
你输入一个字符肯定是不可预料的

第二个问题也一样