/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Ayuda - No me respeta el "scanf"

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
pedroafontes



Registrado: 03 Jul 2012
Mensajes: 3

MensajePublicado: 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" Razz

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

MensajePublicado: 03/07/2012 5:46 pm
Título:

Cuando, al pedirte el numero, introduces:
Código:
123{ENTER}

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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com