Foros del Web » Programación para mayores de 30 ;) » C/C++ »

No producir desbordamiento con tipo int.

Estas en el tema de No producir desbordamiento con tipo int. en el foro de C/C++ en Foros del Web. Hola a todos Lo que estoy buscando es una manera segura de ingresar un entero por teclado y guardarlo en una variable int.- El programa ...
  #1 (permalink)  
Antiguo 17/10/2010, 10:20
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
No producir desbordamiento con tipo int.

Hola a todos
Lo que estoy buscando es una manera segura de ingresar un entero por teclado y guardarlo en una variable int.-
El programa que dejo a continuación se acerca bastante pero tengo un problema, si ingreso por ejemplo 99999 estoy sobrepasando el máximo permitido para el tipo int.-
Estoy leyendo sobre limits.h y errno pero no logro implementarlo.-
Otra cosita, ¿si verifico con un bucle cada carácter ingresado y resultara ser todos números,y no sobrepasara el máximo permitido para el tipo int?, ¿sera muy complicado?

Código:
#include <stdio.h>
#include <stdlib.h>

#define IMPRIME printf ("\n\tIngrese un numero (maximo a 5 digitos)...: ");

int verifica(void)
{
   char buf[30];
   char *p;
   int numero,ver=0;

   while(ver !=1)
   {
      if (fgets(buf, 6, stdin) != NULL)
      {
         numero = strtol(buf, &p, 10);
      }
  
      if (buf[0] != '\n' && (*p == '\n' || *p == '\0'))
      {
         ver=1;
      }
      else
      {
         printf("\n\tNo es numero (apriete una tecla para continuar)...");system("PAUSE>null"); 
         system("cls");
         IMPRIME;
      }
   }
   return numero; 
}


int main(void)
{
   int numVer;
   IMPRIME(numVer=verifica()); 

   printf("\n\tIngreso..:%d - Apriete una tecla para cerrar la ventana...",numVer);system("PAUSE>null");	
   return 0;
}
Gracias por el tiempo.-
Saludos.
Daniel
  #2 (permalink)  
Antiguo 18/10/2010, 05:21
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: No producir desbordamiento con tipo int.

Conviene que indiques qué compilador y sistema operativo utilizas, puede ayudar a precisar mejor la respuesta. En este caso, ya que citas que con 99999 sobrepasas el límite, parece que sea uno de 16 bits.

El archivo limits.h contiene solamente definiciones para los máximos valores permitidos para los diversos tipos de enteros. Edita ese archivo (lo normal es que esté en un subdirectorio llamado include dentro del directorio donde tengas instalado el compilador), así verás cuáles son los límites que te da tu compilador y cómo los llama.

La manera más fácil de verificar esos desbordamientos al introducir valores enteros es utilizando tipos del rango superior y comparando con el máximo del tipo que quieres utilizar, por ejemplo, para un short int (16 bits), el valor máximo es 32768. Lees un valor en un long int (32 bits) y comparas con el valor SHRT_MAX (nombre más probable, comprueba en tu compilador).
  #3 (permalink)  
Antiguo 18/10/2010, 05:22
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: No producir desbordamiento con tipo int.

Conviene que indiques qué compilador y sistema operativo utilizas, puede ayudar a precisar mejor la respuesta. En este caso, ya que citas que con 99999 sobrepasas el límite, parece que sea uno de 16 bits.

El archivo limits.h contiene solamente definiciones para los máximos valores permitidos para los diversos tipos de enteros. Edita ese archivo (lo normal es que esté en un subdirectorio llamado include dentro del directorio donde tengas instalado el compilador), así verás cuáles son los límites que te da tu compilador y cómo los llama.

La manera más fácil de verificar esos desbordamientos al introducir valores enteros es utilizando tipos del rango superior y comparando con el máximo del tipo que quieres utilizar, por ejemplo, para un short int (16 bits), el valor máximo es 32768. Lees un valor en un long int (32 bits) y comparas con el valor SHRT_MAX (nombre más probable, comprueba en tu compilador).
  #4 (permalink)  
Antiguo 18/10/2010, 10:35
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: No producir desbordamiento con tipo int.

Hola
Fue un error garrafal, es de 32 bits.
  #5 (permalink)  
Antiguo 19/10/2010, 00:29
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: No producir desbordamiento con tipo int.

Si el compilador es de 32 bits, comprueba si tiene un tipo long long (entero de 64 bits). Si lo tiene, utilízalo como almacenamiento temporal para tus comprobaciones de rango.
  #6 (permalink)  
Antiguo 20/10/2010, 18:02
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: No producir desbordamiento con tipo int.

Hola Fw190
Ya tengo todo solucionado encontré un muy buen código para trabajar con fgets y logre hacer mi propio programa para validar todo a mano.-
Gracias x los consejos.
Daniel

Etiquetas: int, tipo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:10.