【问题标题】:how do I validate user input as a double in C++?如何在 C++ 中将用户输入验证为双精度?
【发布时间】:2010-07-18 01:37:49
【问题描述】:

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

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! 语句,所以它不会提示另一个输入。我想提示输入,检查它是否合法……如果是双精度,继续……如果不是双精度,再次提示。

有什么想法吗?

【问题讨论】:

  • 下次发帖时请务必查看格式指南。谢谢。
  • 什么意思?格式有什么问题?
  • 我编辑了您的帖子,但在编辑之前代码没有格式化。点击“N 分钟前编辑”查看原帖。
  • 我明白了...我以为我已经做到了...一定是错过了格式化按钮并意外按下了其他东西。我很抱歉。

标签: c++ validation double cin


【解决方案1】:

试试这个:

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

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

【讨论】:

  • 这是在while(1) 循环内吗?
  • 我只使用cin.sync(); 而不是while(cin.get() != '\n');。在我看来,它更具可读性。
  • 在 UNIX 中,它是一个 \r\n,所以最后还有一个 \n。所以是的,它会起作用的。
  • @chaosTechnician,当我尝试这个例子时,cin.sync() 对我不起作用。 while(cin.get() != '\n');但确实如此。知道为什么吗?
  • 不,之前写过:cin.sync();这是代码的 sn-p: int main(int argc, char *argv[]) { double x;而 (1) { cout ';如果 (cin >> x) { 中断; } else { // 不是一个有效的数字 cout
【解决方案2】:

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

【讨论】:

  • 这仍然导致无限循环打印Invalid Input!...它没有提示输入另一个输入。
  • cin.ignore() 有什么作用?
  • 与 casablanca 的循环相同,它会丢弃所有字符,包括换行符,以消除导致第一次提取失败的任何非数字数据。
【解决方案3】:
#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;
}

【讨论】:

  • 输入验证应该是一项更容易完成的任务。这使得教新手并帮助他们享受他们正在做的事情变得非常困难。我希望看到一个针对新手的关于 cin 和 cout 的防弹且仍然有用的教程。
【解决方案4】:
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】:

    我会使用:

    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】:

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

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

      【讨论】:

      • 如何检查类型double
      • 这只是检查输入是否有小数部分,这可能不是问题的意思。
      • 是的,我们大多数人都知道 Hristo 的意思,但这个答案确实解决了他提出的问题:“我如何检查输入是否真的是双精度数?”将其解释为“我假设我得到了数字,我如何确保它们不是整数?”使它成为一个非常有用的答案。不需要投票,imo。
      • @chaosTechnician 错误消息显示“输入无效!请输入数值。”。整数和非整数都是“数值”。所以这个答案的意图对我来说非常不清楚。无论如何都不会投票。 :-)
      猜你喜欢
      • 2021-07-01
      • 1970-01-01
      • 2019-07-09
      • 2021-07-24
      • 2014-10-26
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多