uso usar tokens sirve que para ejemplo dev como c++ visual-c++

usar - strtok c++ ejemplo



Cómo validar la entrada numérica C++ (7)

Me gustaría saber cómo limitar un valor de entrada a decimales firmados usando std::cin .


Algo como:

double a; cin >> a;

Debe leer su multa "decimal" firmada.

Necesitará un bucle y un código para asegurarse de que maneja la entrada no válida de una manera sensata.

¡Buena suerte!


El operador cin >> funciona mediante la lectura de un carácter a la vez hasta que alcanza el espacio en blanco. Eso -1a2.0 toda la cadena -1a2.0 , que obviamente no es un número, por lo que la operación falla. Parece que en realidad tienes tres campos allí, -1, a y 2.0. Si separa los datos por espacios en blanco, cin podrá leer cada uno sin problemas. Solo recuerde leer un char para el segundo campo.


Si la variable de respaldo del cin es un número, y la cadena proporcionada no es un número, el valor de retorno es falso, por lo que necesita un bucle:

int someVal; while(!(cin >> someVal)) { cin.reset(); cout << "Invalid value, try again."; }


double i; //Reading the value cin >> i; //Numeric input validation if(!cin.eof()) { peeked = cin.peek(); if(peeked == 10 && cin.good()) { //Good! count << "i is a decimal"; } else { count << "i is not a decimal"; cin.clear(); cin >> discard; } }

Esto también da un mensaje de error con la entrada -1a2.0 evitando la asignación de solo -1 a i.


Probé muchas técnicas para leer la entrada de enteros del usuario usando el operador >> , pero de una forma u otra todos mis experimentos han fallado.

Ahora creo que la función getline() (y no el método con el mismo nombre en std::istream ) y la función strtol() del include cstdlib es la única solución consistente y predecible para este problema. Agradecería que alguien me probara mal. Aquí hay algo así como el que uso:

#include <iostream> #include <cstdlib> // @arg prompt The question to ask. Will be used again on failure. int GetInt(const char* prompt = "? ") { using namespace std; // *1 while(true) { cout << prompt; string s; getline(cin,s); char *endp = 0; int ret = strtol(s.c_str(),&endp,10); if(endp!=s.c_str() && !*endp) return ret; } }

  • * 1: colocar el using namespace whatever; para el alcance global puede llevar a la ruptura de "construcciones unitarias" (google!) en proyectos más grandes, por lo que debe evitarse. Practique no usar de esa manera, ¡incluso en proyectos más pequeños!
  • Leer números enteros de archivos es una cuestión muy diferente. El enfoque de Raúl Roa puede ser bueno para eso si se resuelve adecuadamente. También sugiero que no se toleren los archivos de entrada incorrectos, pero realmente depende de la aplicación.
  • Tenga en cuenta que usar >> y getline() en el mismo programa en cin provocará algunos problemas. Use uno solo o google para saber cómo manejar el problema (no demasiado).

Combinando las técnicas de la respuesta superior aquí y este sitio web, me sale

input.h

#include <ios> // Provides ios_base::failure #include <iostream> // Provides cin template <typename T> T getValidatedInput() { // Get input of type T T result; cin >> result; // Check if the failbit has been set, meaning the beginning of the input // was not type T. Also make sure the result is the only thing in the input // stream, otherwise things like 2b would be a valid int. if (cin.fail() || cin.get() != ''/n'') { // Set the error state flag back to goodbit. If you need to get the input // again (e.g. this is in a while loop), this is essential. Otherwise, the // failbit will stay set. cin.clear(); // Clear the input stream using and empty while loop. while (cin.get() != ''/n'') ; // Throw an exception. Allows the caller to handle it any way you see fit // (exit, ask for input again, etc.) throw ios_base::failure("Invalid input."); } return result; }

Uso

inputtest.cpp

#include <cstdlib> // Provides EXIT_SUCCESS #include <iostream> // Provides cout, cerr, endl #include "input.h" // Provides getValidatedInput<T>() int main() { using namespace std; int input; while (true) { cout << "Enter an integer: "; try { input = getValidatedInput<int>(); } catch (exception e) { cerr << e.what() << endl; continue; } break; } cout << "You entered: " << input << endl; return EXIT_SUCCESS; }

Ejecución de muestra

Ingrese un número entero: a
Entrada inválida.
Ingrese un número entero: 2b
Entrada inválida.
Ingrese un número entero: 3
Usted ingresó: 3.


No estoy tratando de ser grosero. Solo quería compartir una solución que proporcioné, que creo que es más sólida y permite una mejor validación de entrada.

Por favor, consulte: Mi solución para la validación de entrada