/
Inicio :: Foros

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

que significa fflush(stdin)

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



Registrado: 22 Oct 2007
Mensajes: 14

MensajePublicado: 27/10/2007 4:49 am
Título: que significa fflush(stdin)

hola a todos.
lo he buscado por todas partes y no entiendo esta funcion, y si alguien me puede dedir:
sacnf("%f",&d);
sacnf("%c",&c);
es lo mismo que cargar:
sacnf("%f%*c",&d);

gracias!
Volver arriba
spartan117



Registrado: 26 Oct 2005
Mensajes: 38
Ubicación: monterrey

MensajePublicado: 27/10/2007 10:28 am
Título:

ok no entendi la pregunta pero noto que pones sacnf en vez de scanf, eso no sera un problema?
Volver arriba
digies



Registrado: 18 Nov 2005
Mensajes: 240
Ubicación: Cono Sur

MensajePublicado: 27/10/2007 4:42 pm
Título:

Hola

Siguiendo con el título de tu pregunta, lo que hace fflush(stdin) es "limpiar" el buffer de entrada estándar del teclado.

La función fflush solamente está definida para flujos de datos donde no se produzcan operaciones de entrada. Es decir, fflush no esta definida para estreams de la entrada estándar, tambien hay que hacer notar que fflush está especificado para volcar los datos de los tampones a fichero.

fflush(stdin) es una "extensión" de algunos compiladores -especialmente de Windows- como ser Turbo C++, Dev-C++, Visual C++, o Borland C++, y no forma parte del estándar de C. Por lo tanto el comportamiento de esta función en compiladores de Unix/Linux/Mac es incierto, indeterminado, nulo, o peligroso.

Es por ello que es recomendable reemplazarla por algún bloque de código que cumpla la misma función de limpiar el buffer de la entrada estándar (teclado).

Ahora volviendo al cuerpo de tu mensaje, parece que tipeaste mal las funciones de entrada de datos, tal vez quisiste hacerlo así:

Código:

scanf("%f",&d);
scanf("%c",&c);
es lo mismo que cargar:
scanf("%f%*c",&d);


"%*c" dentro de scanf("%f%*c",&n) lee el caracter '\n' que se inserta al pulsar la tecla <Enter>.
Para que lo entiendas mejor, prueba los siguientes códigos y notarás la diferencia cuando lo ejecutas:

Código:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int a;
    char b;

    printf("Numero : ");
    scanf("%d", &a);
    printf("Caracter : ");
    scanf("%c", &b);
    system("PAUSE");
    return EXIT_SUCCESS;
}


Código:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int a;
    char b;

    printf("Numero : ");
    scanf("%d%*c", &a);
    printf("Caracter : ");
    scanf("%c", &b);
    system("PAUSE");
    return EXIT_SUCCESS;
}


Bien, ahora una alternativa 'no universal' para reemplazar el ya mencionado "%*c" dentro del scanf es utilizando el también ya mencionado fflush(stdin) así:

Código:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int a;
    char b;

    printf("Numero : ");
    scanf("%d", &a);
    fflush(stdin);
    printf("Caracter : ");
    scanf("%c", &b);
    system("PAUSE");
    return EXIT_SUCCESS;
}


... y obtenemos los mismos resultados que en el código anterior. Pero eso no es todo, también existen otras "artimañas" para seguir resolviendo el problema usando bloques de código creados por nosotros mismos, como ser:

Código:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
     int a;
     char b;
     printf("Numero: ");
     scanf("%d", &a);
     scanf("%*[^\n]"); /* Lee cualquier carácter mientras no sea nueva línea */
     scanf("%*c"); /* Puede reemplazarse por getchar(); */
     printf ("Caracter: ");
     scanf ("%c", &b);
     system("PAUSE");
     return EXIT_SUCCESS;
}


... y otra muy buena alternativa -un poquito más elaborada por cierto- es:

Código:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
     int a;
     char b, ch;
     printf("Numero: ");
     scanf("%d", &a);
     /* Eliminar los caracteres restantes de la ínea: */
     while((ch=fgetc(stdin))!=EOF && ch!='\n')
         ; /* Descartar el resto de la línea */
     printf ("Caracter: ");
     scanf ("%c", &b);
     system("PAUSE");
     return EXIT_SUCCESS;
}


... y así podemos seguir implementando otras y otras soluciones al respecto. Y para terminar coloco ahora otra forma ligeramente diferente al segundo código propuesto pero al revés:

Código:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
     int a;
     char b;
     printf ("Numero: ");
     scanf ("%d", &a);
     printf ("Caracter: ");
     scanf ("%*c %c", &b);
     system("PAUSE");
     return EXIT_SUCCESS;
}

Para mi gusto su otra versión es mejor que éta porque primero matcheo el dato y luego leo del buffer.

...Y si aun quieres saber más acerca de estos "caracteres o comodines raros" usados en el scanf para solucionar el problema mencionado, en la dirección de abajo a buena información, espero que sepas algo de inglés.

http://home.datacomm.ch/t_wolf/tw/c/getting_input.html

Un saludo
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