elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [src]problema con fflush()
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: [src]problema con fflush()  (Leído 8,912 veces)
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: [src]problema con fflush()
« Respuesta #10 en: 27 Enero 2013, 12:26 pm »

Pero ¿para que limpiar el buffer? Es que es innecesario, son ganas de ponerse a limpiar el buffer. Usad las funciones correctas y punto. Ya lo zanjó hace tiempo Eternal Idol:
Citar
« Respuesta #3 en: 24 Agosto 2009, 20:13 »
Zanjado: NO USAR JAMAS.

fgets
+
sscanf


Código
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char **argv)
  4. {
  5.    int opcion;
  6.  
  7.    do{
  8.        printf("Opcion: ");
  9. char linea[80];
  10. fgets(linea, sizeof(linea), stdin);
  11.        sscanf(linea, "%d",&opcion);
  12.    }while(opcion!=0);
  13.  
  14.    return 0;
  15. }
Las demás formas de hacerlo son parches para corregir.
Hola! como ya te dijeron esa "mala lectura" se debe al ENTER(que tambien es un caracter) que queda almacenado en el bufer del teclado, por eso con el segundo getchar no podes ingresar... Otra alternativa para limpiar el bufer seria algo como:
Código
  1. while(getchar()!='\n');/* este bucle debe ir despues de cada getchar*/


Saludos

PD: fpurge no es estandar por eso no te funciona
Durasno en ese caso deberías comprobar también si es EOF así que quedaría así:
Código
  1. char c;
  2. while(c=getchar() != '\n' && c != EOF){}
Pero como ya digo son parches. Hacerlo bien no mata a nadie:
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    char a,b;
  6.    char buffer[80];
  7.  
  8.    printf("Which character is bigger?\n");
  9.  
  10.    printf("Type a single character:");
  11.    fgets(buffer,sizeof(buffer),stdin);
  12.    sscanf(buffer,"%c",&a);
  13.  
  14.    printf("Type another character:");
  15.    fgets(buffer,sizeof(buffer),stdin);
  16.    sscanf(buffer,"%c",&b);
  17.  
  18.    if(a > b)
  19.    {
  20.        printf("'%c' is greater than '%c'!\n",a,b);
  21.    }
  22.    else if(b > a)
  23.    {
  24.        printf("'%c' is greater than '%c'!\n",b,a);
  25.    }
  26.    else
  27.    {
  28.        printf("Next time don't press the same character");
  29.    }
  30.    return(0);
  31. }
¡Un saludo!


« Última modificación: 27 Enero 2013, 12:46 pm por avesudra » En línea

Regístrate en
durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: [src]problema con fflush()
« Respuesta #11 en: 27 Enero 2013, 16:08 pm »

Citar
Hacerlo bien no mata a nadie
y cual es la forma de hacerlo bien??? lo que indicaste vos??? puede ser, pero solo es una forma, es por eso que se indico varias alternativas... No veo el inconveniente de limpiar el bufer(de echo me gusta mas el bucle que usar fgets+sscanf)


Saludos


En línea

Ahorrate una pregunta, lee el man
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: [src]problema con fflush()
« Respuesta #12 en: 27 Enero 2013, 16:25 pm »

y cual es la forma de hacerlo bien??? lo que indicaste vos??? puede ser, pero solo es una forma, es por eso que se indico varias alternativas... No veo el inconveniente de limpiar el bufer(de echo me gusta mas el bucle que usar fgets+sscanf)


Saludos
No claro que no hay inconveniente Durasno, pero es que ¿para qué andar limpiando el buffer si puedes introducir datos sin tener que limpiarlo? A mí también me gusta más el bucle, es más cómodo que hacer fgets + sscanf pero si con fgets + sscanf evito tener que limpiarlo pues prefiero utilizarlo.Además echale un ojo a esto:

http://crasseux.com/books/ctutorial/ y al apartado de http://crasseux.com/books/ctutorial/String-output-and-input.html#String%20output%20and%20input y en concreto esto:

http://crasseux.com/books/ctutorial/Deprecated-formatted-string-input-functions.html#Deprecated%20formatted%20string%20input%20functions

Además acabo de leer que fgets tendría que sustituirlo por getline así que algo que aprendo :)
¡Un saludo!
« Última modificación: 27 Enero 2013, 17:04 pm por avesudra » En línea

Regístrate en
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [src]problema con fflush()
« Respuesta #13 en: 30 Enero 2013, 18:40 pm »

Por partes ...

como ya he dicho en otras ocasiones estoy siguiendo un libro para aprender a programar en C, en el capitulo 13 hay un codigo para un programa que se supone lo que hace es comparar dos caracteres
Te recomendaría buscar otro libro, para sugerencias sobre alguno bueno nada mejor que el motor de búsqueda de los foros.

El programa que publicas tiene deficiencias como: el tipo de retorno de getchar es int, no se vacía explícitamente la salida estándar, vaciar el bufer de la entrada estándar como se indica no es valido, si se va a imprimir una literal es mejor utilizar puts y por ultimo "return(0);" no es una llamada a función y por ende los paréntesis están de mas.

----

Te dejo este codigo, compilado con GCC a mi me funciona sin problema alguno.

Puedes usar setbuff o setbuffer para limpiar el buffer de entrada
En C estándar tampoco vale como solución ya que la llamada a setbuf termina como una llamada a setvbuf y esta ultima debe ser llamada antes de cualquier uso del stream (salvo su apertura).

----

Las demás formas de hacerlo son parches para corregir.Durasno en ese caso deberías comprobar también si es EOF así que quedaría así:
Código
  1. char c;
  2. while(c=getchar() != '\n' && c != EOF){}
Primero la pedantería: el tipo de retorno de la función getchar es int y faltan paréntesis para obtener el resultado esperado:
Código
  1. int ch;
  2.  
  3. /* ... */
  4.  
  5. while ((ch = getchar()) != EOF && ch != '\n')
  6.   ;

Pero como ya digo son parches. Hacerlo bien no mata a nadie:
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    char a,b;
  6.    char buffer[80];
  7.  
  8.    printf("Which character is bigger?\n");
  9.  
  10.    printf("Type a single character:");
  11.    fgets(buffer,sizeof(buffer),stdin);
  12.    sscanf(buffer,"%c",&a);
  13.  
  14.    printf("Type another character:");
  15.    fgets(buffer,sizeof(buffer),stdin);
  16.    sscanf(buffer,"%c",&b);
  17.  
  18.    if(a > b)
  19.    {
  20.        printf("'%c' is greater than '%c'!\n",a,b);
  21.    }
  22.    else if(b > a)
  23.    {
  24.        printf("'%c' is greater than '%c'!\n",b,a);
  25.    }
  26.    else
  27.    {
  28.        printf("Next time don't press the same character");
  29.    }
  30.    return(0);
  31. }
No puede decirse que la solución en base a un bucle sea un parche cuando, si se piensa un poco, garantiza el descarte de la linea sin importar su longitud, algo que no sucede al utilizar fgets. Por ejemplo si en tu programa la primera linea tiene mas de 79 caracteres su salida no es la correcta.

Opciones hay varias: fgets + sscanf, el mentado bucle o bien scanf mas algunos especificadores de formato. Cual elegir lo decide el contexto.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: [src]problema con fflush()
« Respuesta #14 en: 30 Enero 2013, 19:29 pm »

Por partes ...
Te recomendaría buscar otro libro, para sugerencias sobre alguno bueno nada mejor que el motor de búsqueda de los foros.

El programa que publicas tiene deficiencias como: el tipo de retorno de getchar es int, no se vacía explícitamente la salida estándar, vaciar el bufer de la entrada estándar como se indica no es valido, si se va a imprimir una literal es mejor utilizar puts y por ultimo "return(0);" no es una llamada a función y por ende los paréntesis están de mas.

----
En C estándar tampoco vale como solución ya que la llamada a setbuf termina como una llamada a setvbuf y esta ultima debe ser llamada antes de cualquier uso del stream (salvo su apertura).

----
Primero la pedantería: el tipo de retorno de la función getchar es int y faltan paréntesis para obtener el resultado esperado:
Código
  1. int ch;
  2.  
  3. /* ... */
  4.  
  5. while ((ch = getchar()) != EOF && ch != '\n')
  6.   ;
No puede decirse que la solución en base a un bucle sea un parche cuando, si se piensa un poco, garantiza el descarte de la linea sin importar su longitud, algo que no sucede al utilizar fgets. Por ejemplo si en tu programa la primera linea tiene mas de 79 caracteres su salida no es la correcta.

Opciones hay varias: fgets + sscanf, el mentado bucle o bien scanf mas algunos especificadores de formato. Cual elegir lo decide el contexto.

Un saludo
Hola rir3760 no sé donde notas la actitud de pedantería si es por lo de "hacerlo bien no mata a nadie", solo me remito a lo que ya se ha hablado en el foro.Si que es cierto  eso de que está mal el bucle  :-\ .

¡Un saludo!
« Última modificación: 30 Enero 2013, 19:33 pm por avesudra » En línea

Regístrate en
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [src]problema con fflush()
« Respuesta #15 en: 30 Enero 2013, 22:04 pm »

no sé donde notas la actitud de pedantería si es por lo de "hacerlo bien no mata a nadie", solo me remito a lo que ya se ha hablado en el foro.
No me refería a ti, me refería a mi en el sentido de "entrar de metiche" y corregir "a diestra y siniestra". A veces me pasa. ;)

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
0x3c

Desconectado Desconectado

Mensajes: 108


learning, making mistakes, having fun


Ver Perfil
Re: [src]problema con fflush()
« Respuesta #16 en: 31 Enero 2013, 03:39 am »

Citar
Te recomendaría buscar otro libro, para sugerencias sobre alguno bueno nada mejor que el motor de búsqueda de los foros.


No, no dejare de usar este libro para aprender C, no lo cambiare por otro, al menos no hasta que lo termine puesto que la version que estoy leyendo es la 'introduccion' a C luego seguire con la version que le sigue...

si me decido a cambiar de libro seria como retroceder pues me gusta el ritmo y la forma como los temas son explicados


saludos
En línea

Si Vis Pacem, Para Bellum.

Another Legend Has Fallen
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [src]problema con fflush()
« Respuesta #17 en: 31 Enero 2013, 17:12 pm »

al menos no hasta que lo termine puesto que la version que estoy leyendo es la 'introduccion' a C luego seguire con la version que le sigue...
Supongo con "version" en realidad te refieres a "Capitulo", ¿Correcto?

No, no dejare de usar este libro para aprender C, no lo cambiare por otro, [...] si me decido a cambiar de libro seria como retroceder pues me gusta el ritmo y la forma como los temas son explicados
No vas a perder tiempo empezando de nuevo (con un libro de calidad) pero a cambio vas a tener que malgastar tiempo (debido a los errores). Yo me iría por lo primero pero, bueno, cada quien decide. Suerte.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
0x3c

Desconectado Desconectado

Mensajes: 108


learning, making mistakes, having fun


Ver Perfil
Re: [src]problema con fflush()
« Respuesta #18 en: 31 Enero 2013, 20:36 pm »

Citar
Supongo con "version" en realidad te refieres a "Capitulo", ¿Correcto?

No, me refiero a la version del libro, en este caso es la segunda version debo admitir que este libro es 'diminuto' y no profundiza mucho en el tema de la programacion en C, sin embargo eso es justo lo que necesito,..al menos por ahora.

La version que le sigue es bastante extensa, y profundiza no solo en la programacion en C, sino tambien en la programacion misma...que es justo lo que necesitare de querer continuar con esto de la programacion, que es lo que estoy planeando hacer.



saludos
En línea

Si Vis Pacem, Para Bellum.

Another Legend Has Fallen
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
duda simple (fflush)
Programación C/C++
Fabi0lo 4 3,749 Último mensaje 29 Septiembre 2012, 10:15 am
por Eternal Idol
Ayuda fflush
Programación C/C++
UnchainedGold40 2 2,411 Último mensaje 23 Marzo 2015, 12:56 pm
por eferion
¿Por qué es necesario fflush ()?
Programación C/C++
mester 4 2,929 Último mensaje 9 Octubre 2016, 21:44 pm
por ivancea96
problema con el buffer del teclado no es fflush(stdin) tranquilos
Programación C/C++
gitii 3 2,197 Último mensaje 30 Abril 2018, 21:04 pm
por gitii
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines