18

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

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!语句,因此它不会提示输入另一个输入。我想提示输入,检查它是否合法......如果它是双重的,继续......如果它不是双重的,再次提示。

有任何想法吗?

4

6 回答 6

16

尝试这个:

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
  }
}

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

于 2010-07-18T01:54:09.387 回答
1

failbit如果出现解析错误,将在使用提取运算符后设置,有几个简单的测试函数goodfail您可以检查。它们彼此完全相反,因为它们的处理eofbit方式不同,但在本例中这不是问题。

然后,您必须failbit在重试之前清除。

正如 casablanca 所说,您还必须丢弃仍留在输入缓冲区中的非数字数据。

所以:

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...
于 2010-07-18T01:48:41.293 回答
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;
}
于 2012-05-05T18:13:22.940 回答
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;
}
}
于 2016-07-05T13:43:44.783 回答
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";
}
于 2018-11-30T00:44:13.907 回答
-1

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

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;
    }
}
于 2010-07-18T01:57:38.797 回答