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

Posted

技术标签:

【中文标题】如何在 C++ 中将用户输入验证为双精度?【英文标题】:how do I validate user input as a double in 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 分钟前编辑”查看原帖。 我明白了...我以为我已经做到了...一定是错过了格式化按钮并意外按下了其他东西。我很抱歉。 【参考方案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 错误消息显示“输入无效!请输入数值。”。整数和非整数都是“数值”。所以这个答案的意图对我来说非常不清楚。无论如何都不会投票。 :-)

以上是关于如何在 C++ 中将用户输入验证为双精度?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 stringstream 在 C++ 中将字符串转换为双精度值 [关闭]

如何在 C++ 中将字符串转换为双精度值?

如何在R中将两个变量(整数)转换为双精度?

无法在文本字段中获取文本输入以解析为双精度

在 C++ 中将字符串转换为双精度

尝试在 C++ 中将字符串转换为双精度时遇到分段错误