[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: problema con scanf (novato)



Si no haces "flush(stdout)" no hay garantía de que el texto salga por
pantalla en el momento en el que pones el "printf()", "printf()" tan
sólo pone datos en el buffer se salida pero no se encarga de imprimirlo.

Saludos.

Por cierto, en la lista GNU-C[1] quizá te puedan ayudar con este y otros
problemas de programación con C.

[1] https://listas.hispalinux.es/mailman/listinfo/gnu-c

El mar, 22-06-2004 a las 15:30, Ramiro Aceves escribió:
> mra@clientes.euskaltel.es escribió:
> 
> >Buenas, la solución a tu problema es hacer un fflush(stdin); despues de 
> >obtener un valor numérico con scanf. La razón es que el sistema 
> >operativo almacena en un buffer las teclas pulsadas, scanf() toma el 
> >primer argumento para saber qué tipo de datos son, por lo tanto el 
> >retorno de carro no lo coge. Después cuando llamas a getchar(), ésta 
> >recibe el siguiente caracter que hay en el buffer del teclado, y como 
> >scanf ha dejado el retorno de carro pues se queda con él. En caso 
> >contrario espera la pulsación.
> >
> >Un saludo,
> >
> >Iñaki R.
> >
> >----- Mensaje Original -----
> >De: Ramiro Aceves <ea1abz@wanadoo.es>
> >Fecha: Martes, Junio 22, 2004 1:28 am
> >Asunto: Re: problema con scanf (novato)
> >
> >  
> >
> >>>De latín nada jejeje. A mi me pasaba lo mismo. Me lo dijeron en 
> >>>      
> >>>
> >>el irc creo o en algún foro y me dieron la explicación pero ahora 
> >>mismo no me acuerdo. Tenía algo que ver con lo que te han dicho 
> >>sobre hacer el flush y todo eso. Desde luego tiene que ver sobre 
> >>la forma en que funciona internamente scanf, pero como ya te he 
> >>dicho ahora mismo ni idea. Siento no poder ayudarte más :(. Saludos.
> >>    
> >>
> >>> 
> >>>
> >>>      
> >>>
> >>Gracias, he estado investigando, y al parecer, es la instrución 
> >>scanf()la que estropea la siguiente getchar().
> >>Si corremos este programa:
> >>
> >>#include <stdio.h>
> >>int N;
> >>int a;
> >>float dato;
> >>char respuesta1,respuesta2,respuesta3;
> >>void main(void){
> >>       printf("mete un float\n");
> >>       scanf("%f",&dato);
> >>       printf("has metido : %f\n",dato);
> >>
> >>printf("ahora los getchar\n");
> >>
> >>respuesta1=getchar();
> >>respuesta2=getchar();
> >>respuesta3=getchar();
> >>
> >>printf("caracter1: %c  caracter2: %c caracter3: %c
> >>\n",respuesta1,respuesta2,respuesta3);
> >>exit(0);
> >>}
> >>
> >>
> >>
> >>obtenemos el resultado inesperado siguiente. Al parecer, el 
> >>retorno de
> >>carro que se mete al introducir el dato en scanf(), lo toma el primer
> >>getchar():
> >>
> >>ea1abz@debian-remix:mete un float
> >>3.14
> >>has metido : 3.140000
> >>ahora los getchar
> >>abc
> >>caracter1:
> >> caracter2: a caracter3: b
> >>
> >>
> >>se me ocurrió meter un espacio  en la instrucción scanf y ahora va
> >>correctamente, aunque el mensaje sale despues de meter los
> >>datos......sigo sin entender... ?¿?¿?¿?   :-\
> >>
> >>
> >>#include <stdio.h>
> >>int N;
> >>int a;
> >>float dato;
> >>char respuesta1,respuesta2,respuesta3;
> >>void main(void){
> >>       printf("mete un float\n");
> >>       scanf("%f",&dato);
> >>       printf("has metido : %f\n",dato);
> >>
> >>printf("ahora los getchar\n");
> >>
> >>respuesta1=getchar();
> >>respuesta2=getchar();
> >>respuesta3=getchar();
> >>
> >>printf("caracter1: %c  caracter2: %c caracter3: %c
> >>\n",respuesta1,respuesta2,respuesta3);
> >>exit(0);
> >>}
> >>
> >>
> >>
> >>ea1abz@debian-remix:
> >>mete un float
> >>3.14
> >>abc
> >>has metido : 3.140000
> >>ahora los getchar
> >>caracter1: a  caracter2: b caracter3: c
> >>
> >>Me han recomendado suscribirme a  progc@yahoogroups.com, a ver si allí
> >>alguien me da solución a esto.
> >>
> >>Gracias.
> >>    
> >>
> >
> >
> >  
> >
> 
> Bien, efectivamente, gracias, funciona al poner el fflush (stdin) 
> después de scanf. Pero todavía tengo una pequeña duda: ¿Por qué el 
> mensaje "ahora los getchar" me sale después de acabar con los tres 
> getchar() y no antes, como está escrito en el código del programa?
> 
> Gracias.
> Ya me voy aclarando.




Reply to: