Búsqueda personalizada
Curso de lenguaje C
 Principal
 Inicio
 Libros
 Librerías
 Mapa Web
 
 Recursos
 Artículos
 Cursos
 Ejercicios
 Guías de uso
 Mini Diccionario 
  
 Sintaxis
 ANSI C
 Ordinogramas
 Pascal
 Pseudocódigo 
  
 Acerca de
 Carlos Pes
 Colaboradores
 Taller de ideas 
  
 Sitios Amigos
 Blogs,...
 Informática,...
 Directorios,...
 Empresas,...
 Gente,...
 Ocio,...
 Tutoriales,...
  
 Mis Blogs en
 Blogger
 BuscoAfiliados 
  
 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.

 Más información
Texto extraído del apartado 11.10 LA FUNCIÓN fflush del libro EMPEZAR DE CERO A PROGRAMAR EN LENGUAJE C, (páginas 297-299).
 Contenidos > Apartado siguiente
1.12 Tipos de errores
 A destacar
Cursos Ejercicios Libros Enlaces Recomendados
Curso Diseño de Algoritmos
Curso Informática Básica
Curso Ingeniería del Software
Curso Marketing en Internet
Curso Lenguaje C
Curso Turbo Pascal
Curso Representación Datos
Ejercicios de Algoritmos
Ejercicios de Lenguaje C
Ejercicios de Ordinogramas
Ejercicios de Pascal
Empezar de cero a programar en lenguaje C
Domine la programación en lenguaje C
Empezar de cero a programar en Pascal
Tutoriales y Cursos
Gane dinero con su web
Comprar dominio
Programación Informática
100% Adsense
Búsqueda personalizada
 Más Webs Interesantes
© 2006-2008 CarlosPes.com