¿Cómo verificar si la entrada es un número entero válido sin ningún otro carácter?

#include  #include  using namespace std; int main() { int x; cout <> x)){ cout << "Error, please try again." << endl; cin.clear(); cin.ignore(numeric_limits::max(), '\n'); } if (x == (5 + 4)){ cout << "Correct!" << endl; } else{ cout << "Wrong!" << endl; } return 0; } 

¿Cómo puedo verificar si el usuario ingresa un número entero válido? En este progtwig que escribí arriba, si el usuario ingresa 9 , debería ser correcto, sin embargo, si el usuario ingresa 9a por ejemplo, debería devolver un error, pero no por alguna razón. ¿Cómo puedo corregirlo?

Cómo lo hice usando cin.peek ()

 #include  #include  #include  using namespace std; int main() { int x; bool ok; cout <> x; while(!ok){ cin >> x; if(!cin.fail() && (cin.peek() == EOF || cin.peek() == '\n')){ ok = true; } else{ cout << "Error, please try again." << endl; cin.clear(); cin.ignore(numeric_limits::max(), '\n'); } } if (x == (5 + 4)){ cout << "Correct!" << endl; } else{ cout << "Wrong!" << endl; } return 0; } 

Puedes leer una cadena, extraer un número entero de ella y asegurarte de que no quede nada.

 std::string line; std::cin >> line; std::istringstream s(line); int x; if (!(s >> x)) { // Error, not a number } char c; if (s >> c) { // Error, there was something past the number } 
 bool isIntegerNumber(const std::string& string){ std::string::const_iterator it = string.begin(); int minSize = 0; if(string.size()>0 && (string[0] == '-' || string[0] == '+')){ it++; minSize++; } while (it != string.end() && std::isdigit(*it)) ++it; return string.size()>minSize && it == string.end(); } 

Tienes una entrada orientada a la línea, por lo que probablemente deberías estar usando getline . Algo como:

 bool getIntFromLine( std::istream& source, int& results ) { std::string line; std::getline( source, line ); std::istringstream parse( source ? line : "" ); return parse >> results >> std::ws && parse.get() == EOF; } 

debería hacer el truco.

Al usar esto, tu ciclo sería:

 while ( !getIntFromLine( std::istream, x ) ) { std::cout << "Error, please try again." << std::endl; } 

Tenga en cuenta que esta técnica también significa que no tiene que preocuparse por borrar el error o volver a sincronizar la entrada.

Por la razón de que esto suceda, eche un vistazo a este enlace :

Extrae y analiza los caracteres secuencialmente de la secuencia para interpretarlos como la representación de un valor del tipo apropiado, que se almacena como el valor de val. Internamente, la función accede a la secuencia de entrada construyendo primero un objeto centinela (con noskipws configurado en falso). Luego (si es bueno), llama a num_get :: get (usando la configuración regional seleccionada de la secuencia) para realizar tanto la extracción como las operaciones de análisis, ajustando las banderas de estado internas de la secuencia en consecuencia. Finalmente, destruye el objeto centinela antes de regresar.

Luego observa el comportamiento si intentas algo como esto:

 int x = 0; cin >> x; std::cout << x << std::endl; std::cout << cin.good() << std::endl; g++-4.8 -std=c++11 -O3 -Wall -pedantic -pthread main.cpp && echo "900a100" | ./a.out // Output: // 900 // 1 

Si ingresa "a100" en su lugar, genera:

 0 0 

prueba esto:

 std::string input; std::cin >> input; if ( std::all_of(input.begin(), input.end(), std::isdigit) ) { //input is integer } 

Refiere esto:

C ++ Solución para verificar si la entrada es un número entero

Uno que he visto que funciona para algunas situaciones es:

  • Lee la entrada como una cadena. cin >> str
  • Descodificar al número: atoi, o sscanf, o secuencia de cadenas, etc.
  • imprime el número en una cadena (usando sprintf o stringstream)
  • compruebe si es igual a la cadena de lectura. (usando cadenas ==, no char *)

Rápido y simple de hacer. Utiliza las reglas de ruptura de palabras Cin >> str, acepta números negativos, rechaza números desbordados. Pero rechaza “+10”, lo que en algunas situaciones te hace feliz, y en algunos no.

Si puede usar C ++ 11 (y su comstackdor tiene soporte completo de expresiones regulares), también puede usar la biblioteca :

 #include  #include  #include  #include  #include  int main() { std::string line; std::pair value = std::make_pair(0, false); std::cout << "5 + 4 = "; while (!value.second) { while (!std::getline(std::cin, line)) { std::cout << "Error, please try again." << std::endl; std::cin.clear(); std::cin.ignore(std::numeric_limits::max(), '\n'); } if (!std::regex_match(line, std::regex("(\\+|-)?[[:digit:]]+"))) { std::cout << "Error, please try again." << std::endl; } else { value = std::make_pair(std::stol(line), true); } } if (value.first == (5 + 4)) { std::cout << "Correct!" << std::endl; } else { std::cout << "Incorrect!" << std::endl; } return 0; }