elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 22:24  


Tema destacado: Suscripción al boletín mensual de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  fflush(stdin)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: fflush(stdin)  (Leído 29,025 veces)
Siuto
Colaborador
***
Desconectado Desconectado

Mensajes: 1.587


Que puedo decir??


Ver Perfil WWW
fflush(stdin)
« en: 17 Octubre 2005, 06:41 »

En un post anterior tenia una duda de porque se usaba la funcion fflush(stdin), pero ahora lo q no enteindo o mas bien me intriga es: se debe usar en algun momento en particular o solo esta para evitar posibles errores por no vaciar el bufer?




En línea
sch3m4
Colaborador
***
Desconectado Desconectado

Mensajes: 1.603

Nihil est in intelectu quod prius not fuerit insen


Ver Perfil WWW
Re: fflush(stdin)
« Respuesta #1 en: 17 Octubre 2005, 15:41 »

se debe usar siempre que se vaya a trabajar con el teclado


En línea

OpenSec

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..
Dark-MX

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: fflush(stdin)
« Respuesta #2 en: 17 Octubre 2005, 16:36 »

no se debe usar NUNCA

fflush espera un flujo de salida, no de entrada
En línea
Siuto
Colaborador
***
Desconectado Desconectado

Mensajes: 1.587


Que puedo decir??


Ver Perfil WWW
Re: fflush(stdin)
« Respuesta #3 en: 17 Octubre 2005, 17:30 »

se debe usar siempre que se vaya a trabajar con el teclado
pero yo no lo uso siempre, y en la mayoria de los casos no tengo problemas.
Mi pregunta es cuando se debe usar, no cuando se recomienda...


no se debe usar NUNCA

fflush espera un flujo de salida, no de entrada
Me parece que ya te estas confundiendo, ya te lo dice el nombre:

Código:
fflush(stdin)
      (stdin)
          in // in=entrada
En línea
Gangrel

Desconectado Desconectado

Mensajes: 235


Ver Perfil WWW
Re: fflush(stdin)
« Respuesta #4 en: 17 Octubre 2005, 18:08 »

fflush sierve para liberar memoria de algun bufer, un lugar donde es recomendable usarla es:

fflush(stdin);
getch();

ó

fflush(stdin);
scanf(%s %d,cadena,numero);

Por lo menos yo trato casi siempre de usarla y mas si se trata de un bucle de menu. Tambien sirve para sockets y para otras cosillas
En línea

La educacion no es un privilegio, es un derecho.

http://www.usuarios.lycos.es/protg
heap

Desconectado Desconectado

Mensajes: 272



Ver Perfil WWW
Re: fflush(stdin)
« Respuesta #5 en: 17 Octubre 2005, 20:19 »

//me equivoque que lo borren
« Última modificación: 17 Octubre 2005, 20:24 por heap » En línea

heap

Desconectado Desconectado

Mensajes: 272



Ver Perfil WWW
Re: fflush(stdin)
« Respuesta #6 en: 17 Octubre 2005, 20:24 »

Ya les dijo Dark-MX que no se debe usar en stdin nunca !
  The function fflush() forces a write of all buffered data for the given output or update stream via the stream's underlying write function.

Output es un buffer de salida no de entrada, no confundan.
No hay una manera estandar de deshacerse de el input de un standar input stream como stdio. Dejen de ser perezosos y leanlo hasta que quiera.
while(c!=EOF){
 c= getchar();
}
y listo.
Por cierto preguntar en este foro acerca de C creo que no es la mejor idea, veo que los que responden no saben de que estan hablando. Se ven cosas muy frecuentes como:
scanf(%s %d,cadena,numero);
fflush(stdin);

Ahora me gustaria ver que el usuario metiera una cadena mayor a al buffer de cadena, y ademas la funcion ni siquiera compila deberia ser scanf("%(limit)s, %d", cadena, &numero); Y aun asi yo no meteria esa linea en ningun codigo mio.

« Última modificación: 17 Octubre 2005, 20:25 por heap » En línea

sch3m4
Colaborador
***
Desconectado Desconectado

Mensajes: 1.603

Nihil est in intelectu quod prius not fuerit insen


Ver Perfil WWW
Re: fflush(stdin)
« Respuesta #7 en: 17 Octubre 2005, 21:58 »

estoy de acuerdo con gangrel, a ver si viene alguien más avanzado y nos lo afirma. No obstante, en el curso que dió ]_HqH_[ se decia eso mismo, fflush() limpia el buffer de la variable que sea, si se especifica STDIN se le esta diciendo que limpie el buffer de la entrada estandar de datos (Standar Input). Yo he podido experimentar cuando programé un keylogger, que si al inicio no limpiaba el buffer del teclado, la funcion GetAsyncKeyState() me devolvia unos caracteres, cuando yo no habia pulsado ninguna tecla.
En línea

OpenSec

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..
Ragnarok
Colaborador
***
Desconectado Desconectado

Mensajes: 4.561


Shrödingerificado


Ver Perfil
Re: fflush(stdin)
« Respuesta #8 en: 17 Octubre 2005, 22:05 »

Ya se ha dicho muchas veces en este foro que no está definida para flujos de entrada, su comportamiento es indefinido y por tanto puede funcionar o no, o los lunes si.

http://foro.elhacker.net/index.php/topic,28049.msg141969.html#msg141969

http://c.conclase.net/librerias/funcion.php?fun=fflush
En línea

No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones
Blue_box

Desconectado Desconectado

Mensajes: 286


Abre la mente.


Ver Perfil
Re: fflush(stdin)
« Respuesta #9 en: 18 Octubre 2005, 09:16 »


De forma simple este comando solo limpia el buffer de entrada del teclado y si debe ser usado en aquellos ciclos en los que se tienen que guardan cadenas de forma constantes por ejemplo:

Código:
char nombre[10][50];

a=0;
do
{
 cout<<"Pon el nombre del alumno "<<a+1<<": ";
 fflush(stdin); cin>>nombre[a];
 a++;
}while(a<=10);

Este código se comporta de forma diferente cuando se limpia y cuando no el buffer de entrada del teclado y de igual forma con scanf, ya que las instrucciones esperan una respuesta del buffer del tipo de dato que esperan al no limpiar el buffer y encontrar un valor, dentro del espacio de memoria que ellos leen entónces toman este valor(basura normalmente), como la respuesta del usuario y provoca los fallos dentro del programa.
En línea

El verdadero conocimiento no es bueno o malo sino una combinación de ambos.
Deja de ver lo que te han puesto frente a ti y mejor ve lo que realmente es.
Blue_box

Desconectado Desconectado

Mensajes: 286


Abre la mente.


Ver Perfil
Re: fflush(stdin)
« Respuesta #10 en: 18 Octubre 2005, 09:31 »


Se me paso decir que esta característica se ve solo en carácteres no he visto que haya problemas con los demás tipos de variables, y como último fflush(stdin) no debe ser usado solo para pedir una cadena de forma individual.
En línea

El verdadero conocimiento no es bueno o malo sino una combinación de ambos.
Deja de ver lo que te han puesto frente a ti y mejor ve lo que realmente es.
Salvilz

Desconectado Desconectado

Mensajes: 22


Ver Perfil
Re: fflush(stdin)
« Respuesta #11 en: 18 Octubre 2005, 09:51 »

Por cierto preguntar en este foro acerca de C creo que no es la mejor idea, veo que los que responden no saben de que estan hablando. Se ven cosas muy frecuentes como:
scanf(%s %d,cadena,numero);
fflush(stdin);

Yo estudio C en informatica, y siempre me han enseñado que un scanf debe ir acompañador siempre de un fflush(stdin) :S
En línea
P[i]


Desconectado Desconectado

Mensajes: 472


Ver Perfil
Re: fflush(stdin)
« Respuesta #12 en: 18 Octubre 2005, 15:36 »


 Haber me he estado documentando, y he encontrado esto:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_fflush.asp. Aki microsoft explica cuando se debe usar.
 Se debe poner antes de introducir datos con el teclado.(El primero es dificil que estea lleno asi que no se le suele poner)
 Por eso la funcion fflush se puede poner al principio o al final de la funcion.
Ej:

Código:
int main() {
 
 int x;
 scanf("%i",&x);
 fflush(stdin); // preparamos el buffer para el siguiente captura
 .........
 scanf("%i",&x);
 fflush(stdin); // lo volvemos a preparar
 ....

o tambien:
Código:
int main() {

 int x;
 fflush(stdin); // por si acaso se limpia ya al principio
 scanf("%i",&x);
 .....
 fflush(stdin); // limpiamos buffer
 scanf("%i",&x);

 Para mi la mejor forma es la segunda por si las mosca se le ocurre al usuario pulsar el teclado antes, y por eso se enseña que se ponga siempre antes.
 Saludos.
 
En línea
heap

Desconectado Desconectado

Mensajes: 272



Ver Perfil WWW
Re: fflush(stdin)
« Respuesta #13 en: 18 Octubre 2005, 20:22 »

Dios mio, pero se les dice y siguen insistiendo.......uno puede llevar un caballo al rio, pero no obligarlo a tomar agua......
Si les ense~aron a usar scanf y fflush(stdin) les estan robando la plata, y ese documento de microsoft da pena, sirve para nada !
  /* You must flush the input buffer before using gets. */
   fflush( stdin );   // fflush on input stream is an extension to the C standard
   printf( "Enter the same sentence with gets: " );
   gets( string );
   printf( "%s\n", string );
}

Claramente microsoft nunca pondra un codigo en su codigo, ademas ahi claramente dice que el fflush es una extension de el standard de C y por lo que veo es que eso es visual c ++ y no C. Para explicarme voy solo voy a decir lo siguiente

gets(string) es un buffer overflow seguro, y permite a cualquiera reescribir el puntero de interrupcion, de hecho si intentan compilar un programa con esta funcion el compilador envia un warning diciendo eso mismo, es una funcion vieja y que ya nadie usa.

int scanf(const char *format, ...); Sucede lo mismo, no se puede checar por overflows, ni integers overflows ni nada, por ello se evita leer de esta forma. Usen en cambio funciones como getchar o fgets(). Si su argumento es que usan scanf y siempre les ha funcionado intenten esto:
#include <stdio.h>
int main(int argc, char **argv) {
unsigned int x;
scanf("%i",&x);
printf("%d", i);
}
que pasa si el usuario entra 4294967297 ? Ahora diganme que importa si i imprime 1 igual funciona........me imagino que pensaran lo mismo cuando hagan
int *ptr = malloc( i * sizeof(int)); y se den cuenta que tendran un hermoso heap overflow en su programa.

Y ahora si pasamos a fflush(sdin) que obviamente no funcionara si usan gcc pork el fflush es para forzar la escritura de caracteres qeu estan en un output buffer y no la menera de leer input y descartarlo que es realmente lo que ustedes quieren hacer. Ya les dije, la forma de lograrlo es realmente leyendo todo le input..
http://www.eskimo.com/~scs/C-faq/q12.26.html

Espero ver las perlas que me van a poner como codigos.......que pasa que nadie pone atoi(); ? seguro esa tambien les funciona no ? y como todo programador de windows sabe:
Citar
It's OK to crash on bad input.
It's OK to give incorrect output on bad input.
If a bug doesn't show, it doesn't exist.
http://liw.iki.fi/liw/texts/programming-truths.html


En línea

Dark-MX

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: fflush(stdin)
« Respuesta #14 en: 18 Octubre 2005, 21:51 »

pa los que no sepan ingles  ::) "fflush en un flujo de entrada es una extension al C estandar"

extension al estandar = NO ESTANDAR

Citar
Microsoft dijo:
fflush( stdin );   // fflush on input stream is an extension to the C standard

pa los que no sepan que es una extension: es algo extra que a los desarrolladores de un compilador en especifico   les parecio bonito incluir, y que lo mas seguro es que nunka jamas funcione en otro lado


asi que estan terkos y terkos y terkos nomas pk toda su vida han hecho algo y ya por eso kreen que esta bien.

Si en su version especifika de su kompilador especifiko de su plataforma especifika algo parece no estar mal, sera mejor que se aseguren que esa version especifika de ese kompilador especifiko de esa plataforma especifica sea :  XX de Visual Studio para Windows y que nunka jamas se les okurra ejekutarlo en otro lado, de lo kontrario no se sabe que pueda pasar (lo que se konoce por komportamiendo indefinido):

en un buen dia donde salga el sol y todos esten felices: que funcione bien

en un dia komun y korriente kon clima lluvioso: que su programa haga kosas totalmente lokas pero que no truene

el dia mas importante, en el que justamente le estan enseñando komo funciona su programa al primer kliente de su empresa: que el programa truene irremediablemente

alguno de uds ya dijo que a veces le funcionaba y a veces no... no sean terkossss

independientemente de que tan emocionados e impacientes esten de hacerlo: si la funcion NO espera un flujo de entrada, sean amables konsigo mismos y NO LE DEN UN FLUJO DE ENTRADA

komo diria el kuate creador de C++ FAQ Lite: han sido advertidos...
« Última modificación: 18 Octubre 2005, 22:17 por Dark-MX » En línea
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines