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

guauuu. ¿y eso como se usa? ¿puedes poner un ejemplo donde pueda compilarlo para ver como funciona y depurarlo a ver si me entero?
Creo que entiendo lo que hace tu funcion pero lo que haces de enum class no soy capaz de que compile.
Edito:
Tuve que modificar tu codigo porque eso que pones de enum class mi compilador no se lo traga y supongo que o bien el compilador que uso es anterior a c++11 que creo que es donde se metio eso segun he leido, o bien no es estandard o yo que se jajaja.
Asi lo he dejado:
Código C++:
Ver original
  1. //---------------------------------------------------------------------------
  2. #include <iostream>
  3. #include <sstream>
  4.  
  5. using namespace std;
  6.  
  7. enum ConvertError
  8. {
  9.   NoError,
  10.   Overflow,
  11.   WrongFormat
  12. };
  13. //---------------------------------------------------------------------------
  14.  
  15. ConvertError ToInt( std::istream& stream, int& value )
  16. {
  17.   ConvertError toReturn = NoError;
  18.  
  19.   bool negate = false;
  20.   bool firstChar = true;
  21.   value = 0;
  22.   bool nextIteration = true;
  23.   do
  24.   {
  25.     char c = stream.peek();
  26.  
  27.     if( c == EOF )
  28.       nextIteration = false;
  29.     else
  30.     {
  31.       stream.get(); // discard from the stream
  32.  
  33.       if( c==' ' || c=='\n' || c=='\r' || c=='\t' )
  34.         nextIteration = false;
  35.       else if( isdigit(c) )
  36.       {
  37.         int newValue = value*10+c-'0';
  38.         if( newValue < value )
  39.         {
  40.           nextIteration = false;
  41.           toReturn = Overflow;
  42.         }
  43.         value = newValue;
  44.       }
  45.       else
  46.       {
  47.         if( (c != '-' && c != '+') || !firstChar )
  48.         {
  49.           nextIteration = false;
  50.           toReturn = WrongFormat;
  51.         }
  52.         else
  53.           negate = (c=='-');
  54.       }
  55.     }
  56.     firstChar = false;
  57.   } while(nextIteration);
  58.  
  59.   if( negate )
  60.     value *= -1;
  61.  
  62.   return toReturn;
  63. }
  64. //---------------------------------------------------------------------------
  65.  
  66. int main(int argc, char* argv[])
  67. {
  68.    stringstream stream;
  69.    string aux;
  70.    int valor;
  71.    cin >> aux;
  72.    stream <<aux;
  73.    switch(ToInt(stream,valor)){
  74.       case 0:
  75.          cout<<"El valor es: "<<valor<<endl;
  76.          break;
  77.       case 1:
  78.          cout<<"Huvo overflow"<<endl;
  79.          break;
  80.       case 2:
  81.          cout<<"Formato incorrecto"<<endl;
  82.          break;
  83.    }
  84.    return 0;
  85. }
  86. //---------------------------------------------------------------------------

Por cierto no sabia que un enum se podia usar como tipo de retorno.
Otra cosa ¿que virtudes tiene tu codigo con respecto al mio?
Y si quieres echar un vistazo a como hago para ejecutar tu funcion y me dices si es correcto o hay un camino mas corto para no tener que usar stringstream...

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