SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: kingsizen en Viernes 24 de Abril de 2009, 07:11

Título: fflush (stdin) , flusshal. cuando usarlos? como funcionan?
Publicado por: kingsizen en Viernes 24 de Abril de 2009, 07:11
hola amigos del foro. como dice el titulo quisiera saber cuales de estas dos funciones usar para limpiar el buffer, el dev-c++ no reconoce flusshal(), pero en un examen final vi que lo utilizan.

ahora algunas veces por ejemplo tengo:
sentencias;
..;
..;
c=getchar();

y el programa sigue de largo, por lo que para que tome un caracter hay ke ponerle
sentencias;
..;
..;
c=getchar();
c=getchar();

pero si le ponemos
sentencias;
..;
..;
fflush(stdin);
c=getchar();
toma el caracter sin ningun problema.

la pregunta es... cuando utilizar esa funcion??? porque en un programa la incluyo a cada rato y no quiero que se me vuelva un vicio!!, la antepongo siempre ante una toma de caracter o palabra, esta bien?
como funciona exactamente?

muchas gracias. espero sus respuestas!!
Título: Re: fflush (stdin) , flusshal. cuando usarlos? como funcionan?
Publicado por: Eternal Idol en Viernes 24 de Abril de 2009, 08:05
Nunca hay que usar fflush con stdin, su comportamiento es indefinido por el standard.

Es mejor que uses fgets y sscanf.
Título: Re: fflush (stdin) , flusshal. cuando usarlos? como funcionan?
Publicado por: kingsizen en Viernes 24 de Abril de 2009, 20:54
mmm.. sigo sin entender...
como hago para limpiar el buffer? para que sirve limpiar el buffer? cuando tengo que hacerlo?..
espero su respuesta. muchas gracias!
Título: Re: fflush (stdin) , flusshal. cuando usarlos? como funcionan?
Publicado por: Eternal Idol en Viernes 24 de Abril de 2009, 21:27
GIYF (http://www.google.com/search?q=fflush+stdin).
Título: Re: fflush (stdin) , flusshal. cuando usarlos? como funcionan?
Publicado por: kingsizen en Lunes 27 de Abril de 2009, 21:46
amigos, no me quedo muy claro esto, por lo tanto voy con un ejemplo:

en este ejercicio en la carga  de datos, se saltean algunos gets.. es ahi cuando debo limpiar el buffer??. espero sus respuestas.. muchas gracias!

Código: C
  1.  
  2. # include <stdio.h>
  3. # include <string.h>
  4. # define sub 50
  5.  
  6. struct productos
  7. {
  8.        char codigo[5];
  9.        char modelo[10];
  10.        char descripcion[200];
  11.        float precio;
  12.        char codprov[10];
  13.        char nomprov[30];
  14. };
  15.  
  16. void carga (struct productos [],int *);
  17.  
  18. main()
  19. {    
  20.       struct productos prod[sub];
  21.       int cant_prod;
  22.       cant_prod=0;
  23.      
  24.       carga (prod,&cant_prod);
  25. }
  26.  
  27. void carga (struct productos p[],int *cant )
  28. {
  29.      int i=*cant;
  30.      char r;
  31.      do
  32.      {  
  33.          
  34.          printf ("Ingrese Codigon");
  35.          scanf ("%s",&p[i].codigo);
  36.          [color=#BF0000]//fflush (stdin)????????????????????;[/color]
  37.          printf ("Ingrese Modelon");
  38.          gets(p[i].modelo);
  39.          printf ("Ingrese Descripcionn");
  40.          gets(p[i].descripcion);
  41.          printf ("Ingrese Precion");
  42.          scanf ("%f",&p[i].precio);        
  43.          printf ("Ingrese Cod proveedorn");
  44.          scanf("%s",p[i].codprov);                  
  45.          printf ("Ingrese Nombre proveedorn");
  46.          gets(p[i].nomprov);
  47.          i++;
  48.          printf ("Seguir ingresando datos?n");
  49.          scanf ("%c",&r);
  50.          }while (r !='n');
  51.      *cant=i;
  52. }
  53.  
  54.  
Título: Re: fflush (stdin) , flusshal. cuando usarlos? como funcionan?
Publicado por: Eternal Idol en Lunes 27 de Abril de 2009, 22:55
No, en lugar de usar scanf y gets, usa fgets (con stdin) y sscanf.
Título: Re: fflush (stdin) , flusshal. cuando usarlos? como funcionan?
Publicado por: betopin en Martes 28 de Abril de 2009, 02:06
Hay dos opciones para que no hayan saltos

1) Limpiar el buffer y luego capturar

Ej:
Código: C
  1. fflush(stdin);
  2. gets(arreglo);
  3.  

2) Usar getchar (Que para el caso funciona como un filtro) y capturar

Ej:
Código: C
  1.  getchar();
  2. scanf("%c",&var);
  3.  

El problema en ambos casos es el mismo, se queda el caracter 'n' en el buffer en una captura de datos previa y al realizar el intento de una nueva captura tal caracter se libera

Saludos
Título: Re: fflush (stdin) , flusshal. cuando usarlos? como funcionan?
Publicado por: kingsizen en Martes 28 de Abril de 2009, 04:13
excelente!! eso queria saber!!... osea ke limpio el buffer tantas veces como "gets" use?
Título: Re: fflush (stdin) , flusshal. cuando usarlos? como funcionan?
Publicado por: betopin en Martes 28 de Abril de 2009, 06:27
Cita de: "kingsizen"
excelente!! eso queria saber!!... osea ke limpio el buffer tantas veces como "gets" use?

Si o captures caracteres con scanf();

Saludos
Título: Re: fflush (stdin) , flusshal. cuando usarlos? como funcionan?
Publicado por: Eternal Idol en Martes 28 de Abril de 2009, 08:02
NINGUNA DE ESAS OPCIONES ES BUENA, A VER SI LEEN POR FAVOR!