输入一个大于或等于0的函数
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
template<class T>
bool input(T& a)
{
int i = 1;
while(true)
{
cin >> a ;
if(a >= 0)
return true;
else
{
if(i == 3) return false;
cout << "the input is not ge than 0"
<< "do you want to try again? Y / N "
<< endl;
char ch;
cin >> ch;
if(ch != 'Y' && ch != 'y' ) return false;
++i;
}
}
}
int main()
{
int inum;
double dnum;
cout << "please input a integer number" << endl;
if(!input(inum))
{
cout << "the input is not correct" << endl;
return false;
}
cout << inum;
cout << "please input a float number" << endl;
if(!input(dnum))
{
cout << "the input is not correct" << endl;
return false;
}
cout << dnum;
return 0;
}
总结, 程序给用户提供三次修改错误输入的机会,这里的输入错误只考虑了输入负数的情况,没有考虑输入非数字等情况下导致cin处于错误状态等情况的处理.
对上述代码进行修改
template<class T>
bool input(T& a)
{
int i = 1;
while(true)
{
cin >> a ;
if(cin && a >= 0) // 保证输入正确
return true;
else
{
if(i == 3) return false;
if(!cin)
{
cin.clear(); // 恢复cin到正确状态
cin.get(); // 清空缓冲区 , 以便接下来正确输入, 没有这句,上次错误输入的内容仍旧留在缓冲区中,只能清掉一个字符
// 改成 cin.ignore((std::numeric_limits <int> ::max)(), '/n'); 实现输入缓冲区完全刷新
}
cout << "the input is not ge than 0"
<< "do you want to try again? Y / N "
<< endl;
char ch;
cin >> ch;
if(ch != 'Y' && ch != 'y' ) return false;
++i;
}
}
}
总结,考虑了如果要求输入数字,实际输入了字符情况的处理,注意到 cin.clear()之后,不能直接使用cin输入下一个字符.
问题: cin.get 或 cin.ignore 只能删除掉缓冲区中的一个字符,考虑如何清除缓冲区所有内容.
关于输入出错,参考了http://topic.csdn.net/t/20050518/21/4017759.html以及http://blog.csdn.net/BEN1978/archive/2006/06/29/850352.aspx