代码之家  ›  专栏  ›  技术社区  ›  Hristo

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

  •  18
  • Hristo  · 技术社区  · 15 年前

    如何检查输入是否真的是双精度的?

    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! 语句,因此它不会提示输入其他内容。我想提示输入,检查是否合法。。。如果是双人,继续。。。如果不是double,则再次提示。

    有什么想法吗?

    7 回复  |  直到 15 年前
        1
  •  16
  •   casablanca    15 年前

    试试这个:

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

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

        2
  •  1
  •   Ben Voigt    15 年前

    failbit 如果出现解析错误,则在使用提取运算符后会设置一些简单的测试函数 good fail 你可以查一下。他们完全相反,因为他们处理 eofbit

    然后,你必须清除 故障位 在再试之前。

    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...
    
        3
  •  0
  •   cpx    15 年前

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

    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;
        }
    }
    
        4
  •  0
  •   Notinlist    13 年前
    #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;
    }
    
        5
  •  0
  •   Denys Shabelnyk    9 年前
    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;
    }
    }
    
        6
  •  0
  •   mmontoya    6 年前

    我会用:

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