如何在 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
将在使用提取运算符后设置,如果有解析错误,有几个简单的测试函数 good
和 fail
你可以检查。它们完全相反,因为它们处理 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++ 中将用户输入验证为双精度?的主要内容,如果未能解决你的问题,请参考以下文章