当我们使用cin函数作为输入的时候,可能会出现输入错误的问题,例如下面给出的例子:
#include<iostream>
using namespace std;
int main()
{
int m;
cin >> m;
cout << "第一次输出结果:" << m << endl;
cin >> m;
cout << "第二次输出结果:" << m << endl;
return 0;
}
我们定义了m为整型,可如果我输入的是字符类型q会怎么样呢?
我们可以看到第一次输出0,跳过了第二次输入,第二次输出也为0;
这是因为第一次输入’q‘时,q与我们给m所定义的int型所不符,因此输入失败,输出结果为0,同时’q'还占据了缓冲区,使得我们无法继续输入;
这时我们需要检查输入的数据类型是否正确,我们需要用到cin.fail函数检查输入数据的合法性;
#include<iostream>
using namespace std;
int main()
{
int m;
cin >> m;
if (cin.fail())
{
cout << "输入不合法!!!"<<endl;
}
else {
cout << "第一次输出结果:" << m << endl;
}
cin >> m;
if (cin.fail())
{
cout << "输入不合法!!!"<<endl;
}
else {
cout << "第一次输出结果:" << m << endl;
}
return 0;
}
此时我们再输入q时,则会发生下面的情况;
这时,我们虽然避免了输出了错误数据,但是缓冲区依然被占据,我们无法进行第二次输出,这时我们就需要用到两个函数;cin.clear(),cin.ignore();
cin().clear用来更改cin状态标示符;
cin.ignore(a,ch)方法是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用;
这两个函数搭配使用可以将缓存区的数据提取出来并丢弃;
#include<iostream>
using namespace std;
int main()
{
int m;
cin >> m;
if (cin.fail())
{
cout << "输入不合法!!!" << endl;
cin.clear();
cin.ignore();
}
else {
cout << "第一次输出结果:" << m << endl;
}
cin >> m;
if (cin.fail())
{
cout << "输入不合法!!!" << endl;
cin.clear();
cin.ignore();
}
else {
cout << "第二次输出结果:" << m << endl;
}
return 0;