isdigit()总是通过检查

时间:2013-10-04 16:20:44

标签: c++ eclipse pointers optimization

您好我想检查我的程序是否是用户而不是输入数字,如果他输入的数字不是数字。

所以我做了这个功能

void ValidationController::cinError(int *variable){

    if(!isdigit(*variable)){
        cin.clear();
        cin.ignore(256, '\n');
        cout <<*variable<<endl;
        *variable=0;
        cout <<*variable<<endl;
    }
}

我这样称呼函数:

int more;
cin >>more;
cinError(&more);

所以我的问题是,每当我给出一个数字,它就像我没有。它进入内部,如果并使变量等于零。我在这里缺少什么?

2 个答案:

答案 0 :(得分:8)

撇开您错误地使用isdigit这一事实,无论如何都要检查isdigit为时已晚,因为您正在阅读int。在这种情况下,流的>>运算符会查找数字,而不是代码。

如果要验证用户输入,请将数据读入string,然后在其组件上使用isdigit,如下所示:

string numString;
getline(cin, numString);
for (int i = 0 ; i != numString.length() ; i++) {
    if (!isdigit((unsigned char)numString[i])) {
        cerr << "You entered a non-digit in a number: " << numString[i] << endl;
    }
}
// Convert your validated string to `int`

答案 1 :(得分:2)

检查您的isdigit问题的评论

回到解决方案,异常处理怎么样? (我更喜欢dasblinkenlight的解决方案)

  cin.exceptions(ios_base::failbit); 
  int more;
  try
  {
    cin >> more;
    if (!isspace(cin.get()))
       /* non-numeric, non-whitespace character found
         at end of input string */
      cout << "Error" << endl;
    else
      cout << "Correct" << endl;
  }
  catch(ios_base::failure& e)  
  {        
  /* non-numeric or non-whitespace character found                    
   at beginning */
    cout << "Error" << endl;
  }