输入模板函数

来源:互联网 发布:java class源码 编辑:程序博客网 时间:2024/06/07 06:28

输入一个大于或等于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

 

 


 

原创粉丝点击