我如何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
。