本身作了个简单的总结,不知道准确否,有的话请跟帖指教,THX。
//cin读取:
//①忽略开头whitespace字符
//②碰到第一个非whitespace字符,若是是正确类型则读取并继续;
// 若是是非正确类型,则结束读取并call setstate(ios_base::failbit);
//③若是读取到正确类型字符,碰到其余字符(包括whitespace)则结束读取;
因此要求int,故意错误输入有以下几种状况(举例):
abc (fail)
123abijgiarg (good)
123.234 (good,同上)
因此cin输入int后,为了防止各类故意错误输入,我通常采用下面几种方法:
int num;
cin >>num;
cin.ignore(1024,'\n');
if (cin.fail()){cin.clear(); ...}
能够保证后续程序正确运行,处理但没有判断如123abc类的输入错误,只读取了123
--------------------
char buf[20];
cin.getline(buf,20);
int num=atoi(buf);
if (num==0)...
比较好防止各种错误,可是对于正确输入的0, 没法判断,适合于输入0也错误的状况
--------------------
int num;
string excess;
cin >>num;
getline(cin,excess);
if (cin.fail()||excess!=""){cin.clear(); ...}
能够有效防止全部错误输入 (我的想的,可是怎么网上没见到有人这样用?是否有什么问题?)
-------------------------
其余更好的方法,不知道了ios