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