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

[SOLUCIONADO] Que el ingreso sea sólo números en C

Estas en el tema de Que el ingreso sea sólo números en C en el foro de C/C++ en Foros del Web. Hola a todos. Les muestro el programita, es lo más conciso que pude lograr para validar ingreso de datos, Pero no funciona cuando se ingresa ...
  #1 (permalink)  
Antiguo 27/09/2013, 17:02
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
Información Que el ingreso sea sólo números en C

Hola a todos.
Les muestro el programita, es lo más conciso que pude lograr para validar ingreso de datos,
Pero no funciona cuando se ingresa algo que no sea un entero.-
Ingreso…: 25 (correcto)
Ingreso…: a25 (se produce un bucle infinito)
Ingreso…: 25a (se cierra el programa)

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main(void){
  4.  
  5.     int entero,ok;
  6.     do{
  7.         printf("\n Ingresa un entero.....: ");
  8.         ok=scanf("%d%*c", &entero);
  9.     } while(!ok);
  10.     printf("\n Ingresaste............: %d", entero);
  11.  
  12.     getchar();
  13.     return 0;    
  14. }

Desde ya muchas gracias por lo que puedan hacer por esto.

Saludos.
Daniel
  #2 (permalink)  
Antiguo 27/09/2013, 21:52
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 10 meses
Puntos: 22
Respuesta: Que el ingreso sea sólo números en C

Hola, tienes tres funciones: strtol, strtoul y strtod para convertir strings en long ints, unsigned long ints y doubles respectivamente. Las tres son mejores que las más viejas atoi() y atof(), la principal razón es que manejan control de errores mientras que las últimas no. Lo que tratas de hacer es justo para lo que están hechas, scanf piénsala para cuando necesitas ingresar datos con un formato predefinido y no para validar un tipo de dato como intentas, simplemente aprende a usarlas y si quieres practicar intenta haciendo tu propia implementación.

Te dejo un pequeño ejemplo:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int getInt(){
  5.     static char buf[BUFSIZ];
  6.     char *endPtr = 0;
  7.     int n;
  8.     do{
  9.        if(endPtr != 0)printf("\a");
  10.        fgets(buf, BUFSIZ, stdin);
  11.        n = strtol(buf, &endPtr, 10);
  12.     }while(buf[0] == '\n' || *endPtr != '\n');
  13.     return n;
  14. }
  15.  
  16.  
  17. int main() {
  18.     printf("Ingresa un entero:\n");
  19.     int n = getInt();
  20.     printf("Ingresaste: %d", n);
  21.     return 0;
  22. }

Saludos.
  #3 (permalink)  
Antiguo 28/09/2013, 11:00
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Que el ingreso sea sólo números en C

Hola fightmx.
Muy bueno, yo lo adapté un poco porque en Pelles C me daba 2 warning y además cuando no ingresaba un entero el cursor no quedaba en el lugar adecuado.-
Como no deseo usar bibliotecas no estándar y como necesito ingresar 2 enteros si el error está en el segundo y borro la pantalla pierdo el primer ingreso, para ello voy a tratar de hacer una estructura con los datos correctos y si debo borrar la pantalla después del primer ingreso la invoco y tengo todo solucionado (por lo menos es lo que yo creo).-
Una cosita más, tendrías un tiempo disponible para explicarnos cosas que no entiendo de tú código?.-

Saludos y muchas gracias por compartir tus conocimientos.-

Saludos.
Daniel
  #4 (permalink)  
Antiguo 28/09/2013, 13:29
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 10 meses
Puntos: 22
Respuesta: Que el ingreso sea sólo números en C

No hay problema, qué dudas tienes?
  #5 (permalink)  
Antiguo 28/09/2013, 16:22
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Que el ingreso sea sólo números en C

Hola fightmx.
Me quedan 2 líneas que no logro entender y por favor decime en que lugar
se verifica que no es un entero.-

Código C:
Ver original
  1. int getInt()
  2. {
  3.     static char buf[BUFSIZ];
  4.     char *endPtr = 0;
  5.     int n;
  6.     do
  7.    {
  8.        if(endPtr != 0);
  9.        fgets(buf, BUFSIZ, stdin);  <--- Esta línea puedo entenderlo
  10.        n = strtol(buf, &endPtr, 10); <--- Esta linea es para poner en n un entero
  11.    }while(buf[0] == '\n' || *endPtr != '\n');
  12.     return n;
  13. }

Bueno, un saludo.
Daniel
  #6 (permalink)  
Antiguo 28/09/2013, 19:06
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 10 meses
Puntos: 22
Respuesta: Que el ingreso sea sólo números en C

La función strtol recibe como primer parámetro una cadena de caracteres, comienza a validar cada uno ellos (de izquierda a derecha) siguiendo la sintaxis especificada por la base numérica (tercer parámetro, base 10), y lo interpreta como un valor numérico (valor de retorno), si en el camino encuentra un caracter que no es válido entonces se detiene y establece el puntero (segundo parámetro) en ese dirección, por lo tanto si tu cadena contiene la sintaxis que corresponde a un número valido, la comprobación se detiene hasta el final de la cadena, esto es: '\0'. Para este caso, al utilizar fgets sabemos que la cadena siempre contiene el carácter: '\n' (nueva línea), por lo tanto se puede tomar como el último carácter al cual se establece el puntero cuando tenemos un valor numérico válido.

Saludos.
  #7 (permalink)  
Antiguo 30/09/2013, 15:43
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Que el ingreso sea sólo números en C

Hola fightmx.
Muchas gracias por la aclaración voy a ver si lo asimilo.-

Saludos.
Daniel

Etiquetas: funcion, ingreso, int, programa
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 21:16.