如何在C ++中将用户输入验证为double?

时间:2010-07-18 01:37:50

标签: c++ validation double cin

我如何检查输入是否真的是双倍的?

double x;

while (1) {
    cout << '>';
    if (cin >> x) {
        // valid number
        break;
    } else {
        // not a valid number
        cout << "Invalid Input! Please input a numerical value." << endl;
    }
}
//do other stuff...

上面的代码无限输出Invalid Input!语句,因此它不会提示输入其他内容。我想提示输入,检查它是否合法......如果它是双重的,继续......如果它不是双重的,再次提示。

有什么想法吗?

7 个答案:

答案 0 :(得分:14)

试试这个:

while (1) {
  if (cin >> x) {
      // valid number
      break;
  } else {
      // not a valid number
      cout << "Invalid Input! Please input a numerical value." << endl;
      cin.clear();
      while (cin.get() != '\n') ; // empty loop
  }
}

这基本上清除了错误状态,然后读取并丢弃在前一行输入的所有内容。

答案 1 :(得分:1)

如果存在解析错误,则在使用提取运算符后将设置

failbit,您可以检查几个简单的测试函数goodfail。它们完全相反,因为它们以不同的方式处理eofbit,但这不是本例中的问题。

然后,您必须在再次尝试之前清除failbit

正如卡萨布兰卡所说,你还必须丢弃仍留在输入缓冲区中的非数字数据。

所以:

double x;

while (1) {
    cout << '>';
    cin >> x;
    if (cin.good())
        // valid number
        break;
    } else {
        // not a valid number
        cout << "Invalid Input! Please input a numerical value." << endl;
        cin.clear();
        cin.ignore(100000, '\n');
    }
}
//do other stuff...

答案 2 :(得分:0)

一种方法是检查浮点数是否相等。

double x;

while (1) {
    cout << '>';
    cin >> x;
    if (x != int(x)) {
        // valid number
        break;
    } else {
        // not a valid number
        cout << "Invalid Input! Please input a numerical value." << endl;
    }
}

答案 3 :(得分:0)

#include <iostream>
#include <string>

bool askForDouble(char const *question, double &ret)
{
        using namespace std;
        while(true)
        {
                cout << question << flush;
                cin >> ret;
                if(cin.good())
                {
                        return true;
                }
                if(cin.eof())
                {
                        return false;
                }
                // (cin.fail() || cin.bad()) is true here
                cin.clear();  // clear state flags
                string dummy;
                cin >> dummy; // discard a word
        }
}

int main()
{
        double x;
        if(askForDouble("Give me a floating point number! ",x))
        {
                std::cout << "The double of it is: " << (x*2) << std::endl;
        } else
        {
                std::cerr << "END OF INPUT" << std::endl;
        }
        return 0;
}

答案 4 :(得分:0)

bool is_double(double val)
{
bool answer;
double chk;
int double_equl = 0;     
double strdouble = 0.0;
strdouble = val;           
double_equl = (int)val;
chk = double_equl / strdouble;
if (chk == 1.00)
{
 answer = false; // val is integer
 return answer;
} else {
answer = true;  // val is double
return answer;
}
}

答案 5 :(得分:0)

我会使用:

double x;

while (!(std::cin >> x)) {
  std::cin.clear();
  std::cin.ignore(2147483647, '\n');
  std::cout << "Error.\n";
}

double x;

while ((std::cout << "> ") && !(std::cin >> x)) {
  std::cin.clear();
  std::cin.ignore(2147483647, '\n');
  std::cout << "Error.\n";
}

答案 6 :(得分:-3)

我会使用scanf代替cin

scanf函数将返回目标字符串的匹配数。要确保解析有效的double,请确保scanf的返回值为1。

编辑:
已将fscanf更改为scanf