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

Re: problema con scanf (novato)



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: