我们知道 C++程序有着严格的变量类型的定义,对于每一个变量,都有一个类型与之对应,但是我们输入值给某个变量的时候经常会输入错误,比如程序要你输入整数,你却输入一个小数,这样导致数值的小数部分堵住了输入流,不让你进行下一次输入(其结果是程序直接跳过输入语句执行下一语句),这样的事情常有,而结果是导致程序不能正常运行。
下面举一个简单的列子:
#include <iostream>
using namespace std;
void main(){
int test;
do{
cout<<"输入一个在1到10之间的整数:";
注意这个语句
if (test<1 || test >10){
cout<<"输入错误!"<<endl;
continue;
}
cout<<"你输入的是"<<test <<" "<<"输入正确!"<<endl;
}while(test!=5);
}
当你输入一个整数的时候,比如3,那么程序就会显示:
你输入的是3输入正确!
输入一个在1到10之间的整数:
由于3!=5 因此程序进入新的一轮循环,本来这个程序很简单,可是我毕竟是TC,TC做的事情不是普通人所能想到的,我输入了一个小数比如2.5
奇迹,恩,不应该说是奇迹,应该是列外,正所谓TC万虑,可能有一失。
程序出现混乱,非常混乱,就相当于没有执行cin>>test; 而默认test==2一样。
这是什么原因?难道是BUG,天哪,我无意之间发现了微软的致命错误!
恩,貌似我没有这么伟大(暂时),经过我多方面的努力,克服万千困难(其中的困难不是你们所能想象到的),终于明白了其中的道理。
公理
:
所有从标准输入设备输入的数据都是先保存在缓冲区中,然后istream对象再从缓冲区中进行提取。
istream对象读取它后边的数据。
现在知道了为啥输入2.5之后程序就会出现错误,仿佛不运行语句cin>>test;了吧。因为cin不能对缓冲区进行读取,因为数据不是整形。读取不了。结果程序就跳过这句直接执行后边去了。这样就出现了错误。
说了半天,那怎样解决这个问题呢?
很简单
在cin>>test;后边加
cin.clear(); //清除错误状态!
cin.sync(); //清空缓存区!
其实只要加cin.sync(); 一个就可以了,这样,2.5的小数部分就被清除掉了,也就不会影响后边数据的读取了。
DLTC全手打,好累啊
2009年4月14晚
附:上面的cin默认参数为0,即无错误,正常操作.当我们输入英文字母'k'时,它的状态标识改为fail(即1),即错误,用cout对用户输出信息,再用cin.clear让错误标识改回为0,让我们可以继续输入,再清空流数据继续输入.如果我们没有了cin.clear,则会进入死循环,其过程为我们输入了英文字母,它的状态标识便为fail,当运行到条件判断时,便总是回到错误的条件表示里,并且我们再也没办法输入,因为错误的表示关闭了cin,所以会进入死循环.。