| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
pedroafontes
Registrado: 03 Jul 2012 Mensajes: 3
| Publicado: 03/07/2012 11:18 am | | | Título: Ayuda - No me respeta el "scanf" |
| Buenas a todos del foto! Me llamo Pedro y soy nuevo en el foro. Vengo acá a pedirles ayuda por un trabajo que estoy haciendo. Seguro hay una maquina por acá que lo va a sacar de "taquito" 
El tema es el siguiente.. Este es el codigo:
main(void)
{ //Declaración de variables int legajo; char categoria; legajo=0;
while(legajo!=-1) { printf("Ingrese el numero de legajo del cliente. (-1) para salir\n"); scanf("%d",&legajo);
if(legajo==-1) { printf("Gracias por usar este programa!"); } else { printf("\nPor favor ingrese la categoria de dicho cliente. (a), (b) o (c)\n"); scanf("%c",&categoria); }
} }
El problema es: Cuando compilo, el compilador no me tira ningún error, pero no me respeta el scanf que pide un char (%c) al momento de usarlo. Si lo hago igual pero sin el while si me respeta!!! Estoy 2 semanas renegando con esto y nadaa :s |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 7516 Ubicación: Mexico
| Publicado: 03/07/2012 5:46 pm | | | Título: |
| Cuando, al pedirte el numero, introduces:
La función procesa los caracteres "123" para de ellos obtener el numero (por supuesto este es 123) pero (esta es la primera parte del problema) deja el carácter avance de linea (generado al presionar la tecla {ENTER}) en el bufer de la entrada estándar.
La segunda parte del problema es la forma en que funciona "scanf" con el especificador "%c", en este caso la función obtiene el primer carácter sin importar cual es (en nuestro caso es el avance de linea).
Es por ello que el programa parece "saltarse" esa llamada. Para evitarlo basta con utilizar " %c" para leer el carácter:
| Código: | scanf(" %c", &categoria); |
Este tema (bufer de la entrada estándar y funcionamiento de scanf) ya ha sido tratado en otros temas, si te interesa y deseas consultarlos solo tienes que utilizar el motor de búsqueda de los foros.
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
|
| Volver arriba | |
 |
leosan
Registrado: 19 Abr 2012 Mensajes: 730 Ubicación: GRAN CANARIA
| Publicado: 04/07/2012 9:42 am | | | Título: |
| Una solucion sencilla para "comerte" el carácter avance de linea (generado al presionar la tecla {ENTER}) en el bufer de la entrada estándar es usar | Cita: | | scanf("%c*c",&categoria); |
Usa las etiquetas CODE que aparecen en la parte superior de esto que escribimos para que el código quede sangrado, es decir legible:
| Código: | #include<stdio.h> main(void) { //Declaración de variables int legajo; char categoria; legajo=0;
while(legajo!=-1) { printf("Ingrese el numero de legajo del cliente. (-1) para salir\n"); scanf("%d",&legajo);
if(legajo==-1) { printf("Gracias por usar este programa!"); } else { printf("\nPor favor ingrese la categoria de dicho cliente. (a), (b) o (c)\n"); scanf("%c*c",&categoria); }
} }
|
Por otro lado insisto en lo que te dice rir3760
| Cita: | Este tema (bufer de la entrada estándar y funcionamiento de scanf) ya ha sido tratado en otros temas, si te interesa y deseas consultarlos solo tienes que utilizar el motor de búsqueda de los foros.
|
Un saludo |
|
| Volver arriba | |
 |
|
pedroafontes
Registrado: 03 Jul 2012 Mensajes: 3
| Publicado: 04/07/2012 10:29 am | | | Título: |
| No tengo palabras para agradecer este tip que acaban de darme. Nunca me iba a ocurrir ese problema.. muchisimas gracias Las 2 formas me funcionaron.
Perdoname por publicar un tema repetido..
Les mando un fuerte abrazo!! |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 7516 Ubicación: Mexico
| Publicado: 04/07/2012 10:31 am | | | Título: |
| Utilizar:
| Código: | scanf("%c*c",&categoria); |
Es un error (ortográfico), supongo te refieres a:
| Código: | scanf("%c%*c",&categoria); |
Aun así no tendría el efecto deseado ya que "%c" leería el avance de linea y, a continuación, con "%*c" se descartaría el carácter que indica la categoría.
La forma correcta es utilizándolos al revés:
| Código: | scanf("%*c%c",&categoria); |
Con ello "%*c" descarta el avance de linea y "%c" obtiene el carácter indicando la categoría.
En mi opinión es mejor utilizar " %c", es sencillo y tiene la ventaja de ignorar el espacio blanco sin importar su numero.
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
|
| Volver arriba | |
 |
|
|