Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: RGT en 5 Noviembre 2015, 03:27 am



Título: Validar solo números en un INT en C++
Publicado por: RGT en 5 Noviembre 2015, 03:27 am
Código:
int NumeroLetras;

do
    {
        cout << "\nN\243mero de letras de la palabra: ";
        cin >> NumeroLetras;
    } while(ValidarNumeroIngresado(NumeroLetras));

/*  Validar el número ingresado
------------------------------------------------------------------------*/
int ValidarNumeroIngresado(int NumeroLetras)
{
    if (NumeroLetras < 48 || NumeroLetras > 57)
        return 0;

    else
        return 1;
}

Hola, me deje llevar por la tabla del codigo ASCHII, si se ingresa algo fuera de ese rango, no es considerado un número, pero no funciona.

Alguien sabe mi error?.
Investigué en Google y encuentro muchas formas diferentes, pero para serles sincero no las entiendo.

Espero puedan ayudarme chicos..


Título: Re: Validar solo números en un INT en C++
Publicado por: class_OpenGL en 5 Noviembre 2015, 12:31 pm
Cuando haces esto 'cin >> NumeroLetras;', siendo NumeroLetras un entero, directamente se guarda como un entero, es decir, ya es un número (no necesitas comprobar nada). Lo que tendrías que comprobar es si a la hora de introducir el número, se ha introducido correctamente. Eso se puede hacer (después de 'cin >> NumeroLetras;') viendo si std::cin.fail() retorna true o false. Si retorna true, entonces el número introducido no era correcto (se han introducido decimales, o caracteres, o el número es demasiado grande o pequeño). Si retorna false, eso significa que no ha habido ningún error.

NOTA: Si ha habido un error, tienes que limpiar el buffer que maneja std::cin. Esto lo puedes hacer así:

Código
  1. if(std::cin.fail()) {
  2.    std::cin.clear();
  3.    /*Comunicas que ya has verificado los errores. A partir de esta linea es como si no
  4.     hubieran ocurrido, aunque en un futuro es posible que ocurran mas*/
  5.  
  6.    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  7.  
  8.    /*Si el parametro vale exactamente std::numeric_limits<std::streamsize>::max(),
  9.     entonces se ignora todo hasta el caracter fin de línea*/
  10. }