近期做C++实验大家可能都遇到对C++输入非规定类型数据的情况,例如定义一个int型变量,如果承载非int型数据必然会造成程序的崩溃,对于代码的健壮性有极坏的影响。因此我在此提供一个简单易用的方法。
先说一下最常用的方法,这也是我四个月以前经常使用的一种方法,虽然笨拙,但是对编程者的思维有很大的考验。简而言之就是定义字符指针(char *或者string),把输入的所有数据全部承载,然后通过数组逐个判断,检测非规定类型变量,该报错的报错,该提示的提示,最后将字符数组转换为需要的数据int、double之类之类的。极为麻烦…………
重头戏:简单易用的方法!先贴代码:
int temp;
char t;
cin>>temp;
t=cin.get();
while((cin.fail())||(t!=10))
{
cout<<"输入错误,重新输入!"<<endl;
cin.clear();
cin.sync();
cin>>temp;
t=cin.get();
}
可以看到,只需要12行代码就能完成判定的复杂工作,下面我将详细解释:
这是通过iostream里的函数完成的工作,大家写了一年程序可能都会发现辛辛苦苦写了200多行代码突然发现c++系统函数有这个功能,没错,这个功能就可以算是系统提供的……
首先要解释c++输入的原理,通过cin输入字符时,所有输入的数据都会暂存在缓冲区里,然后根据流处理运算符>>之后的类型进行读取,如果输入不符合规定,cin自己会产生一个错误状态,就是cin.fail();这也就是判定的重点。然后向大家解释一下cin.clear();和cin.sync();这两个函数经常被大家忽视与混淆。前面讲到,cin在输入的时候会产生一个错误状态;cin.clear();就是用来清除这个错误状态的,如果不清除错误状态,会一直在死循环里循环循环…………,而cin.sync()是用来清除缓冲区里剩余信息的。
现在看上面的程序,就清楚读了把,向temp输入数据(cin>>temp;);然后判定cin的状态,如果cin.fail();那么输出一个"输入错误,重新输入!"的提示信息;然后清除cin错误状态(cin.clear();),在清除cin缓冲区数据(cin.sync();),之后重新输入temp,再循环判定,知道cin正确为止……
个人认为C++博大精神,如果你认为一个小功能写的很麻烦,90%是算法没有选对或者有系统函数支撑。欢迎互相探讨。