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, 21:27  


Tema destacado:


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

Desconectado Desconectado

Mensajes: 153


Ver Perfil
Zanjar de una vez fflush(stdin)
« en: 24 Agosto 2009, 19:45 »

¡¡¡Buenas!!!

Ya se ha dicho muchas veces en este foro, que no es correcto utilizar fflush sobre flujos de entrada, en el libro que tengo yo, tambien dice lo mismo y dice que sobre cualquier otro flujo, el comprotamiento queda indefinido.

Se que en el foro, se han dado en diferentes post distitntas alternativas, y aunque las he estado buscando, no se si porque no he sabido buscarlas correctamente, o porque no he tenido mucha paciencia, no las he encontrado.

Asi pues, he abierto este tema, para que el que tenga alternativas a fflush(stdin), las vaya poniendo, e ire editando para dejarlas todas juntas a continuacion.

Si no os parece mal, y para que luego no haya que estar explicando a cada usuario cuales son las alternativas, se les puede remitir a este post.

Un saludo!!!

PD: Yo no conozco ninguna alternativa que me haya servido. :P


En línea
egyware


Desconectado Desconectado

Mensajes: 436


GameDeveloper


Ver Perfil WWW
Re: Zanjar de una vez fflush(stdin)
« Respuesta #1 en: 24 Agosto 2009, 20:02 »

¿Como que quieres liberar el buffer de las teclas presionadas?
Porque no las lees y simplemente las ignoras.


En línea

Eliptico

Desconectado Desconectado

Mensajes: 153


Ver Perfil
Re: Zanjar de una vez fflush(stdin)
« Respuesta #2 en: 24 Agosto 2009, 20:08 »

Escribete este codigo y haz lo que te digo:

Código
#include <stdio.h>
 
int main(int argv, char* argv[])
{
   int opcion;
 
   do{
       printf("Opcion: ");
       scaf("%d",&opcion);
   }while(opcion!=0);
 
   return 0;
}
 

Compilalo, ejecutalo y en lugar de introducir un entero pon escribe "hola" cuando te pida un opcion.

El programa se vuelve loco ¿no?

Ahora, si trabajas en windows, vacia el buffer de entrada con fflush(stdin) justo antes del scanf:
Código
#include <stdio.h>
 
int main(int argv, char* argv[])
{
   int opcion;
 
   do{
       printf("Opcion: ");
 
       fflush(stdin);
 
       scaf("%d",&opcion);
   }while(opcion!=0);
 
   return 0;
}
 

Repite el priceso anterior. ¿Ahora se vuelve loco el programa?
En línea
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.391


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: Zanjar de una vez fflush(stdin)
« Respuesta #3 en: 24 Agosto 2009, 20:13 »

Zanjado: NO USAR JAMAS.

fgets
+
sscanf

Código
#include <stdio.h>
 
int main(int argc, char **argv)
{
   int opcion;
 
   do{
       printf("Opcion: ");
char linea[80];
fgets(linea, sizeof(linea), stdin);
       sscanf(linea, "%d",&opcion);
   }while(opcion!=0);
 
   return 0;
}
« Última modificación: 24 Agosto 2009, 20:16 por Eternal Idol » En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Eliptico

Desconectado Desconectado

Mensajes: 153


Ver Perfil
Re: Zanjar de una vez fflush(stdin)
« Respuesta #4 en: 24 Agosto 2009, 20:21 »

Jajajaja!!!!

Hombre, esa alternativa la he utilizado mas de una vez, mas bien un fgets y un:
- atof
- atoi
- atol
- strtod
- strtol
- strtoul

(no se si me dejo alguna en el tintero... :) )

Pero a veces, por lo menos a mi, resulta mas comodo poder leer un entero directamente, y es mucho mas corto escribir

fflush(stdim);
scanf("%d",&opcion);

que escribir:

fgets(buf,LEN_BUF,stdin);
opcion=strtol(buf,&resto,10);
if(resto)
    ....

Manias que tengo. :P
En línea
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.391


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: Zanjar de una vez fflush(stdin)
« Respuesta #5 en: 24 Agosto 2009, 20:24 »

¿Pero no querias hacerlo bien acaso? ¿Cual es el sentido del hilo entonces? fflush con stdin no se debe usar y punto, ya bastantes hilos al respecto existen.
En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

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