Cómo hacer que cin tome solo números

Aquí está el código

double enter_number() { double number; while(1) { cin>>number; if(cin.fail()) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); cout << "Invalid input " << endl; } else break; cout<<"Try again"<<endl; } return number; } 

Mi problema es que cuando ingreso algo como 1x, se toma 1 como entrada sin notar el carácter que se deja fuera para otra ejecución. ¿Hay alguna manera de hacerlo funcionar con cualquier número real, por ejemplo, 1.8?

Yo usaría std::getline y std::string para leer toda la línea y luego solo saldré del lazo cuando pueda convertir toda la línea a un doble.

 #include  #include  int main() { std::string line; double d; while (std::getline(std::cin, line)) { std::stringstream ss(line); if (ss >> d) { if (ss.eof()) { // Success break; } } std::cout << "Error!" << std::endl; } std::cout << "Finally: " << d << std::endl; } 

Cuando cin encuentra una entrada que no puede leer correctamente en la variable especificada (como ingresar un carácter en una variable entera), entra en un estado de error y deja la entrada en su búfer.

Tienes que hacer varias cosas para manejar adecuadamente este escenario.

  1. Debes probar este estado de error.
  2. Tienes que borrar el estado de error.
  3. Tiene que manejar alternativamente los datos de entrada que generaron el estado de error, o eliminarlos y volver a llamar al usuario.

El siguiente código proporciona uno de los numerosos métodos para hacer estas tres cosas.

 #include #include using namespace std; int main() { cout << "Enter an int: "; int x = 0; while(!(cin >> x)){ cin.clear(); cin.ignore(numeric_limits::max(), '\n'); cout << "Invalid input. Try again: "; } cout << "You enterd: " << x << endl; } 

Podría pasarle un gran valor a cin.ignore como 1000 y es probable que se comporte exactamente igual para todos los propósitos prácticos.

También puede probar cin después del bash de entrada y manejarlo de esa manera, algo así como si (! Cin) {// limpia el error}.

Consulte la referencia istream para otras funciones miembro para manejar el estado de flujo: http://cplusplus.com/reference/iostream/istream/