Ver Mensaje Individual
  #6 (permalink)  
Antiguo 05/11/2015, 09:49
aguml
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Validar solo números en un INT

Despues de quebrarme el coco un poco he conseguido dos formas de hacer lo que pedia:

Código C++:
Ver original
  1. //---------------------------------------------------------------------------
  2. #include <iostream>
  3. #include <cstring.h>
  4.  
  5. bool ObtenerEnteroMetodo1(int *valor);
  6. int ObtenerEnteroMetodo2(int *valor);
  7.  
  8. int main(int argc, char* argv[])
  9. {
  10.    int valor;
  11.  
  12.    switch(ObtenerEnteroMetodo2(&valor)){
  13.       case 0:
  14.          std::cout << "El valor resultante es: " << valor;
  15.          break;
  16.       case 1:
  17.          std::cout << "Huvo Overflow" << std::endl;
  18.          break;
  19.       case 2:
  20.          std::cout << "Formato invalido para un entero" << std::endl;
  21.          break;
  22.    }
  23.  
  24.    return 0;
  25. }
  26. //---------------------------------------------------------------------------
  27.  
  28. bool ObtenerEnteroMetodo1(int *valor)
  29. {
  30.    bool error=false;
  31.    std::cout<<"Introduce un valor entero: ";
  32.    std::cin >> *valor;
  33.  
  34.    //Metodo 1 para comprobar overflow de entero al obtenerlo con cin
  35.    //Este metodo no discrimina entre el fallo, o sea, si meto una cadena
  36.    //que no puede convertir en un numero dará fallo pero no podré saber
  37.    //que fallo dio
  38.    if(std::cin.fail()){
  39.       error=true;
  40.    }
  41.    return !error;
  42. }
  43. //---------------------------------------------------------------------------
  44.  
  45. int ObtenerEnteroMetodo2(int *valor)
  46. {
  47.    //Metodo 2 para comprobar overflow de entero al obtenerlo con cin
  48.    //Creo que es el mas completo
  49.    string cadena;
  50.    int valorbackup;
  51.    int error=0,negativo=false;
  52.  
  53.    *valor=0;
  54.    std::cout<<"Introduce un valor entero: ";
  55.    std::cin >> cadena;
  56.    for(int i=0; i < cadena.length();i++){
  57.       if(cadena[i] >='0' && cadena[i] <='9'){
  58.          valorbackup=*valor;
  59.          *valor*=10;
  60.          *valor += (cadena[i]-'0');
  61.          if(valorbackup != *valor/10){
  62.             error=1; //Huvo overflow
  63.             break;
  64.          }
  65.       }else if(i==0 && cadena[i] =='-'){
  66.          negativo=true;
  67.       }else{
  68.          error=2; //Cadena con formato invalido
  69.          break;
  70.       }
  71.    }
  72.    if(negativo)
  73.       *valor *= -1; //Convertir el numero en negativo
  74.    return error;
  75. }

Me gusta como ha quedado el metodo 2 pero si veis como mejorarlo soy todo oidos jejeje.

Última edición por aguml; 05/11/2015 a las 10:14