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

Dolor de cabeza con scanf en C

Estas en el tema de Dolor de cabeza con scanf en C en el foro de C/C++ en Foros del Web. Esto debe ser tema repetido, pero me he pasado horas sin encontrar una solucion definitiva. Venia usando scanf para leer de teclado sin problemas, hasta ...
  #1 (permalink)  
Antiguo 05/10/2011, 12:44
Avatar de mandrake88  
Fecha de Ingreso: septiembre-2009
Mensajes: 328
Antigüedad: 15 años, 2 meses
Puntos: 13
Dolor de cabeza con scanf en C

Esto debe ser tema repetido, pero me he pasado horas sin encontrar una solucion definitiva.

Venia usando scanf para leer de teclado sin problemas, hasta que escribi el siguiente codigo

Código C:
Ver original
  1. int ej1(){
  2.     int arr1[100];
  3.     int arr2[100];
  4.     int cant = 0;
  5.     char continuar;
  6.     do{
  7.         printf("\n Ingrese numero: ");
  8.         scanf("%d",&arr1[cant]);
  9.         printf("\n Ingrese letra: ");
  10.         arr2[cant] = getchar();
  11.         cant++;
  12.         do{
  13.            printf("\n Desea cargar otro? s/n");
  14.            continuar = getchar();
  15.         }while(continuar=='n' || continuar=='s');
  16.     }while(continuar!='n');
  17.  
  18.    return cant;
  19. }

El problema esta que dps de leer el numero, me saltea el getchar siguiente por que queda el /n del Enter en el buffer (usando scanf para leer el char tambien me pasa lo mismo) . Encontre que una posible solucion era usar fflush(stdin); para vaciar el buffer de entrada, pero no me funciono (ademas de que en muchos lados advertian que no es recomendable el uso)

Cual seria la forma correcta de leer ese numero entero del teclado?
  #2 (permalink)  
Antiguo 05/10/2011, 17:34
Avatar de WizKnight  
Fecha de Ingreso: noviembre-2010
Ubicación: Maracaibo, Venezuela, Venezuela
Mensajes: 19
Antigüedad: 14 años
Puntos: 1
Respuesta: Dolor de cabeza con scanf en C

getchar recibe un caracter y el arreglo arr2[100] es un entero
  #3 (permalink)  
Antiguo 05/10/2011, 19:47
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Dolor de cabeza con scanf en C

Prueba con este metodo casero!!

while (getchar() != '\n');
  #4 (permalink)  
Antiguo 05/10/2011, 22:28
Avatar de mandrake88  
Fecha de Ingreso: septiembre-2009
Mensajes: 328
Antigüedad: 15 años, 2 meses
Puntos: 13
Respuesta: Dolor de cabeza con scanf en C

Cita:
Iniciado por WizKnight Ver Mensaje
getchar recibe un caracter y el arreglo arr2[100] es un entero
fue un error cuando transcribi el codigo aca, el problema del scanf sigue estando. Lo corregiría pero no me deja editar el post u.u
Cita:
Iniciado por sam90 Ver Mensaje
Prueba con este metodo casero!!

while (getchar() != '\n');
Si vi algo por el estilo, que basicamente buscan consumir todo lo que queda en el buffer antes de volver a leer, pero no me parece muy practico.
  #5 (permalink)  
Antiguo 06/10/2011, 01:41
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Respuesta: Dolor de cabeza con scanf en C

En lugar de usar scanf o getchar que dejan basura en el buffer usa fgets (con stdin) y sscanf.

Es un poco mas pesado peo leyendo toda la linea te ahorras problemas:
Código C++:
Ver original
  1. printf("\n Ingrese numero: ");
  2. char linea[80];
  3. fgets(linea, sizeof(linea), stdin);
  4. sscanf(linea, "%d", &arr1[cant]);
  5. printf("\n Ingrese letra: ");
  6. fgets(linea, sizeof(linea), stdin);
  7. sscanf(linea, "%c", &arr2[cant]);
  8. cant++;
  9. do
  10. {
  11.     printf("\n Desea cargar otro? s/n: ");
  12.     fgets(linea, sizeof(linea), stdin);
  13.     sscanf(linea, "%c", &continuar);
  14. } while(continuar != 'n' && continuar != 's');
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #6 (permalink)  
Antiguo 06/10/2011, 05:14
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Dolor de cabeza con scanf en C

Cita:
Iniciado por mandrake88 Ver Mensaje
Si vi algo por el estilo, que basicamente buscan consumir todo lo que queda en el buffer antes de volver a leer, pero no me parece muy practico.
Que otro metodo estas buscando??
  #7 (permalink)  
Antiguo 06/10/2011, 08:10
Avatar de mandrake88  
Fecha de Ingreso: septiembre-2009
Mensajes: 328
Antigüedad: 15 años, 2 meses
Puntos: 13
Respuesta: Dolor de cabeza con scanf en C

Cita:
Iniciado por sam90 Ver Mensaje
Que otro metodo estas buscando??
lo que puso ethernal :D Gracias
  #8 (permalink)  
Antiguo 06/10/2011, 08:16
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Respuesta: Dolor de cabeza con scanf en C

De nadas
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 06/10/2011, 14:37
 
Fecha de Ingreso: octubre-2010
Ubicación: Edo. de México
Mensajes: 94
Antigüedad: 14 años, 1 mes
Puntos: 9
Respuesta: Dolor de cabeza con scanf en C

1. De hecho getchar regresa un valor entero O.o. vean la documentación :p. Asi esta definida esta función:
Código:
 int getchar(void);
2. El metodo de Sam para vaciar el buffer no tiene nada de malo, a fin de cuentas, es lo que se busca, no?
  #10 (permalink)  
Antiguo 28/02/2014, 12:04
 
Fecha de Ingreso: febrero-2014
Mensajes: 1
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Dolor de cabeza con scanf en C

Yo tenía el mismo problema y lo he resuelto con el método de Sam y sin ningún problema. Es más el profesor, estoy en clase, me ha comentado que utilizase este método.

Salu2
  #11 (permalink)  
Antiguo 28/02/2014, 13:10
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 meses
Puntos: 49
Respuesta: Dolor de cabeza con scanf en C

En este caso todo el problema se reduce a dos '\n' que quedan en el buffer después del scanf y del enter del getchar, y con un solo getchar para cada uno nos lo podemos "comer":

Cita:

Ingrese numero: 23

Ingrese letra: a

Desea cargar otro? s/n: s

Ingrese numero: 11

Ingrese letra: s

Desea cargar otro? s/n: n

Cantidad= 2
Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. int ej1(){
  4.     int arr1[100];
  5.     int arr2[100];
  6.     int cant = 0;
  7.     char continuar;
  8.     do{
  9.         printf("\n Ingrese numero: ");
  10.         scanf("%d",&arr1[cant]);
  11.         getchar();
  12.         printf("\n Ingrese letra: ");
  13.         arr2[cant] = getchar();
  14.         getchar();
  15.         cant++;
  16.         printf("\n Desea cargar otro? s/n: ");
  17.         continuar = getchar();
  18.     }while(continuar!='n' );
  19.    return cant;
  20. }
  21. int main()
  22. {
  23.   printf("\nCantidad= %d\n", ej1());
  24.   return 0;
  25. }

¡¡¡Saluditos!!!


Etiquetas: funcion, scanf
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 12:19.