c++ validation double cin

¿Cómo valido la entrada del usuario como un doble en C++?



validation double (7)

Prueba esto:

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

Básicamente, esto borra el estado de error, luego lee y descarta todo lo que se ingresó en la línea anterior.

¿Cómo puedo verificar si la entrada es realmente un doble?

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

El código anterior genera una salida infinita de la Invalid Input! declaración, por lo que no solicita otra entrada. Quiero solicitar la entrada, verificar si es legítima ... si es un doble, continuar ... si NO es un doble, volver a preguntar.

¿Algunas ideas?


Una forma es verificar la igualdad de números flotantes.

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


Yo usaría scanf lugar de cin .

La función scanf devolverá el número de coincidencias de la cadena de destino. Para asegurarse de que se analizó un doble válido, asegúrese de que el valor de retorno de scanf sea ​​1.

Editar:
Se ha cambiado fscanf a scanf .


Yo usaría:

double x; while (!(std::cin >> x)) { std::cin.clear(); std::cin.ignore(2147483647, ''/n''); std::cout << "Error./n"; }

o

double x; while ((std::cout << "> ") && !(std::cin >> x)) { std::cin.clear(); std::cin.ignore(2147483647, ''/n''); std::cout << "Error./n"; }


se establecerá failbit después de usar un operador de extracción si hubo un error de análisis, hay un par de funciones de prueba simples que puede verificar. Son exactamente lo opuesto entre sí porque manejan el eofbit diferente, pero este no es un problema en este ejemplo.

Entonces, tienes que borrar failbit antes de volver a intentarlo.

Como dice casablanca, también debe descartar los datos no numéricos que quedan en el búfer de entrada.

Asi que:

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


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