|
|
| Contenidos > 1.11
La función fflush |
|
Ejemplo
1
(ejemplo_11_44.c del libro):
Si ejecutamos el siguiente programa:
|
#include
<stdio.h>
int
main()
{
int
a, b;
printf( "Introduzca
el primer numero: " );
scanf( "%d",
&a );
printf( "Introduzca
el segundo numero: " );
scanf( "%d",
&b );
printf( "Los valores
son: %d, %d ", a, b );
return 0;
}
|
por pantalla veremos algo parecido a:
Introduzca
el primer numero: 76
Introduzca el segundo numero: 45
Los valores son: 76, 45
|
Obsérvese que, cuando se ejecuta scanf,
por ejemplo, en la primera vez
scanf( "%d",
&a );
el programa se detiene a la espera de que el usuario
teclee el dato
de
entrada requerido, el cual es almacenado, temporalmente, en
el buffer
(memoria intermedia) de la entrada estándar. Y cuando se
pulsa
la tecla INTRO, es, en ese momento, cuando a la variable a
se le asigna el valor introducido. Pero, además, se produce
un
salto de línea automático, de forma que,
después
de introducir el número 76,
la siguiente instrucción se muestra una
línea más abajo. De igual forma,
después de la
instrucción
scanf( "%d",
&b );
también se produce un salto de línea
automático.
En este ejemplo todo ha ido muy bien, sin embargo, se tiene que tener
especial cuidado si utilizados scanf
para leer caracteres.
Ejemplo 2 (ejemplo_11_45.c del libro): En
el siguiente programa:
|
#include
<stdio.h>
int
main()
{
char
a, b, c;
printf( "Introduzca
primer caracter: " );
scanf( "%c",
&a );
printf( "Introduzca
segundo caracter: " );
scanf( "%c",
&b );
printf( "Introduzca
tercer caracter: " );
scanf( "%c",
&c );
printf( "Los valores
son: %c, %c, %c ", a, b, c );
return 0;
}
|
por pantalla se verá algo similar a:
Introduzca
primer caracter: f
Introduzca segundo caracter: Introduzca tercer caracter: h
Los valores son: f,
, h
|
En esta ocasión, ¿por qué no se
ejecuta, correctamente, la siguiente instrucción?
scanf( "%c",
&b );
La razón es la siguiente: cuando se ejecuta la primera instrucción
de entrada
scanf( "%c",
&a );
después de asignar el carácter 'f'
a la variable a,
se produce un salto de línea automático, pero, en
el
buffer del teclado también se ha quedado almacenada la
secuencia
de escape (\n),
que es, precisamente, un carácter. En consecuencia, cuando
se ejecuta la instrucción
scanf( "%c",
&b );
a la variable b
se le asigna el salto de línea almacenado en el buffer de la
entrada estándar, y la ejecución del programa
continua
con la siguiente instrucción. Ahora, el buffer vuelve a
estar
vacío y, por tanto, la entrada de la variable c
sí que se ejecuta de forma correcta.
Para comprobar que esto es así, podemos sustituir la
instrucción
printf( "Los valores
son: %c, %c, %c ", a, b, c );
por esta otra:
printf( "Los valores
son: %d, %d, %d ", a, b, c );
En pantalla veremos:
Introduzca
primer caracter: f
Introduzca segundo caracter: Introduzca tercer caracter: h
Los valores son: 102, 10, 104
|
y como se puede comprobar en las tablas del ASCII, los
números 102,
10
y 104
corresponden a los caracteres 'f',
LF
(Salto de Línea) y 'h',
respectivamente.
Para resolver este problema, antes de leer un carácter con scanf,
hay que vaciar (limpiar) el buffer del teclado. Para ello, se utiliza
la función
fflush.
Ejemplo 3 (ejemplo_11_46.c del libro):
De forma que, el código quedaría de la siguiente
manera:
|
#include
<stdio.h>
int
main()
{
char
a, b, c;
printf( "Introduzca
primer caracter: " );
scanf( "%c",
&a );
printf( "Introduzca
segundo caracter: " );
fflush( stdin );
scanf( "%c",
&b );
printf( "Introduzca
tercer caracter: " );
fflush( stdin );
scanf( "%c",
&c );
printf( "Los valores
son: %c, %c, %c ", a, b, c );
return 0;
}
|
La primera vez que se ejecuta scanf,
el buffer del teclado está vacío, por tanto, no
es preciso utilizar fflush,
pero sí, en los dos casos posteriores. Obsérvese
que, a fflush
hay que indicarle el buffer a limpiar, Standar Input (stdin)
en este caso.
|
|
|
|
|