关于C++的cin的错误输入的问题以及解决办法

最近学校期末用C++做一个实训项目,在用到cin获得用户输入的时候考虑到用户输入的不确定性,要规范cin返回的值,否则会造成意想不到的结果。

先来一个简单的例子:

1
2
3
4
5
6
7
8
int num_input;
cin>>num_input;
while(num_input<=0)
{
cout<<"请输入正数"<<endl;
cin>>num_input;
}
cout<<num_input<<endl;

这串看起来很平常的代码,当我们随便输入一个字符时,便会陷入死循环,一直重复打印”请输入正数“。
出现这种结果的原因是错误输入使cin进入了一种错误的状态(此时cin会返回0),在这种情况下程序会持续输出cout后面的字符串并忽略后面的cin语句。

之前在网上找到一种解决办法是:

1
2
3
4
5
6
7
8
9
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的最大值时则不能应对。

因此有以下更好的解决办法:

1
2
3
4
5
6
7
8
9
int num_input;    
cin >> num_input;
while(cin.fail())
{
cin.clear();
cin.ignore();
cout << "输入错误,请重新输入"<<endl;
cin >> num_input;
}

cin.ignore()作用是忽略掉缓冲区的内容,直到遇到EOF为止

这里如果cin错误,先将cin的错误状态清除,再将输入缓冲区的内容忽略掉,最后再重新输入。
这个方法不仅可以用于防止输入字符陷入死循环,也可以防止输入过大的数而导致错误。

文章作者: Dar1in9
文章链接: http://dar1in9s.github.io/2020/01/19/疑难杂症/关于C++的cin的错误输入的问题以及解决办法/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Dar1in9's Blog