Ver Mensaje Individual
  #13 (permalink)  
Antiguo 20/11/2014, 02:53
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 3 meses
Puntos: 204
Respuesta: do while false

Coincido con leosansan. Lo mejor suele ser primero verificar y después convertir.
Cuando te enfrentas a un usuario lo lógico es pensar mal. Si hay alguna posibilidad de que un usuario introduzca un texto en un campo numérico, ten fe que así lo hará... eso y que el mejor mantenimiento se consigue cuando se separan tareas, lo más factible a la larga es chequear los valores en una primera capa y después hacer las conversiones en una segunda.

Claro que puedes fusionar ambas capas y hacerlo todo a la vez... sin embargo ese código luego te va a resultar más complicado de depurar y de actualizar.

Mi propuesta:

* Detecta el prefijo +/-
* Un número compuesto solo por el prefijo se considera no válido
* Se admiten números sin prefijo.
* Se detectan caracteres no numéricos en cualquier parte de la secuencia.

Código C++:
Ver original
  1. int EsNumero( char* cadena )
  2. {
  3.   int to_return = 0;
  4.  
  5.   if ( *cadena == '-' || *cadena == '+' )
  6.     ++cadena;
  7.  
  8.   do
  9.   {
  10.     to_return = isdigit( *cadena );
  11.   } while( to_return && *++cadena );
  12.  
  13.   return to_return;
  14. }
  15.  
  16. int main ( )
  17. {
  18.   char num [20];
  19.   int numero;
  20.   do
  21.   {
  22.     printf( "Introduzca un numero entero: " );
  23.     scanf( "%s" , num ) ;
  24.   } while( !EsNumero( num ) );
  25.  
  26.   numero = atoi( num );
  27.   printf ( "numero = %d\n" , numero ) ;
  28.   return EXIT_SUCCESS;
  29. }

Un saludo.

Última edición por eferion; 20/11/2014 a las 03:40