最近学校期末用C++做一个实训项目,在用到cin获得用户输入的时候考虑到用户输入的不确定性,要规范cin返回的值,否则会造成意想不到的结果。
先来一个简单的例子:
int num_input;
cin>>num_input;
while(num_input<=0)
{
cout<<"请输入正数"<<endl;
cin>>num_input;
}
cout<<num_input<<endl;
这串看起来很平常的代码,当我们随便输入一个字符时,便会陷入死循环,一直重复打印"请输入正数
"。
出现这种结果的原因是错误输入使cin进入了一种错误的状态(此时cin会返回0),在这种情况下程序会持续输出cout后面的字符串并忽略后面的cin语句。
之前在网上找到一种解决办法是:
int num_input;
cin>>num_input
while(cin.fail())
{
string num_input_string;
cin.clear();
cin>>num_input_string;
cout<<"输入的"<<num_input_string<<"不是数字,重新输入"<<endl;
}
cin.fail()是判断cin的状态的,如果cin为错误状态则返回1,正常状态则返回0
cin.clear()作用是清除cin的错误状态
这里如果错误输入,则用一个string类来接收输入缓冲区中的内容,之后再重新输入。
这个解决方法针对错误输入字符可行,但如果输入的数字超过int的最大值时则不能应对。
因此有以下更好的解决办法:
int num_input;
cin >> num_input;
while(cin.fail())
{
cin.clear();
cin.ignore();
cout << "输入错误,请重新输入"<<endl;
cin >> num_input;
}
cin.ignore()作用是忽略掉缓冲区的内容,直到遇到EOF为止
这里如果cin错误,先将cin的错误状态清除,再将输入缓冲区的内容忽略掉,最后再重新输入。
这个方法不仅可以用于防止输入字符陷入死循环,也可以防止输入过大的数而导致错误。