4

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

所以我做了这个功能

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);

所以我的问题是,每次我给一个数字时,它的行为就像我没有。它进入 if 并使变量等于零。我在这里缺少什么?

4

2 回答 2

8

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

如果要验证用户输入,请将数据读入 a 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`
于 2013-10-04T16:27:56.120 回答
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;
  }
于 2013-10-04T17:01:33.400 回答