我如何validation用户input为双C ++?

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

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! 声明,所以它不会提示另一个input。 我想提示input,检查它是否合法…如果它是双重的,继续…如果不是双重的,再次提示。

有任何想法吗?

尝试这个:

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

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

failbit会在使用提取操作符后设置,如果有parsing错误的话,有几个简单的testing函数是good ,可以检查fail 。 他们完全相反,因为他们处理eofbit不同,但这不是在这个例子中的问题。

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

正如卡萨布兰卡说,你也必须放弃仍然留在input缓冲区中的非数字数据。

所以:

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

一种方法是检查浮动数字相等。

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

我会用scanf而不是cin

scanf函数将返回来自目标string的匹配数。 为了确保parsing了一个有效的double,确保scanf的返回值是1。

编辑:
fscanf更改为scanf