| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
rojid
Registrado: 22 Oct 2007 Mensajes: 14
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |