2009-02-05 26 views

Respuesta

2
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 simplemente -1 a i.

+1

# 1: ¿Qué es 'descartar'? # 2: ¿Por qué '10'? ¿Qué hay de Mac? # 3: ¿Cómo se forma un ciclo para reintentar? Cuando lo escribió intente con la entrada '" ddd "'. Obtendrá sus errores muchas veces. Si no, entonces tengo mucha curiosidad acerca de tu solución. – Notinlist

11

Si la variable 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."; 
} 
+8

play.cpp: 10: error: 'struct std :: istream' no tiene un elemento llamado 'reset' – Ziggy

+5

Y también - si puedo reemplazar el reinicio() con clear(), que quiso decir o no - conduce a un bucle infinito cuando se da una entrada no numérica. – Notinlist

-5

Algo así como:

double a; 
cin >> a; 

Debe leer su multa "decimal" firmada.

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

¡Buena suerte!

1

cin's >> el operador funciona leyendo un carácter a la vez hasta que llega al espacio en blanco. Eso sorberá 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 char para el segundo campo.

0

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, se refieren a: My Solution to Input Validation

0

He intentado muchas técnicas para la lectura de entrada de número entero de que el usuario usando el operador >>, pero de un modo u otro, todos mis experimentos han fracasado.

Ahora pienso que getline() función (no es el método con el mismo nombre en std::istream) y la función de la strtol()cstdlib incluir es la única solución consistente predecible para este problema. Agradecería que alguien me probara mal. Aquí es algo así como el que yo 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: Colocación de using namespace whatever; al ámbito mundial puede dar lugar a la rotura de la "unidad construye" (! 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 enteros a partir 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 el uso de >> y getline() en el mismo programa en cin dará lugar a algunos problemas. Use uno solo o google para saber cómo manejar el problema (no demasiado).
1

La combinación de las técnicas de la respuesta más here y this página web, me sale de entrada

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

muestra de ejecución

Introduzca un número entero: una entrada no válida
.
Ingrese un número entero: 2b
Entrada no válida.
Introduzca un entero:
Ingresó: 3.

Cuestiones relacionadas