Autor
|
Tema: [src]problema con fflush() (Leído 8,913 veces)
|
0x3c
Desconectado
Mensajes: 108
learning, making mistakes, having fun
|
Hola, 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...este es el codigo: #include <stdio.h> int main() { char a,b; printf("Which character is bigger?\n"); printf("Type a single character:"); printf("Type another character:"); if(a > b) { printf("'%c' is greater than '%c'!\n",a ,b ); } else if(b > a) { printf("'%c' is greater than '%c'!\n",b ,a ); } else { printf("Next time don't press the same character"); } return(0); }
se suponia que todo deberia haber marchado bien, sin embargo segun se explica luego en otras paginas esto no sera asi por que la funcion getchar() solo lee standard input y el output que se odtiene no es el deseado...por lo que (segun dice el libro) hay que agregar una funcion que limpie lo que getchar() mete en la variable ' a'....esa funcion es fflush().. entonces el codigo quedara asi: #include <stdio.h> int main() { char a,b; printf("Which character is bigger?\n"); printf("Type a single character:"); printf("Type another character:"); if(a > b) { printf("'%c' is greater than '%c'!\n",a ,b ); } else if(b > a) { printf("'%c' is greater than '%c'!\n",b ,a ); } else { printf("Next time don't press the same character"); } return(0); }
el problema es que a pesar de que agrego fflush() el problema persiste el libro sugiere que si todo sigue igual debo agregar fpurge() cosa que el compilador(GCC) me tira un error a causa de esa "funcion".. !bash-4.2# gcc greater2.c -o greater2 /tmp/cckp5r6k.o: In function `main': greater2.c:(.text+0x33): undefined reference to `fpurge' collect2: error: ld returned 1 exit status
entonces me pregunto..estare haciendo algo mal? por que fflush() no funciona? y ademas fpurge() me causa errores, habra otra solucion? saludos y gracias
|
|
|
En línea
|
Si Vis Pacem, Para Bellum.Another Legend Has Fallen
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
Intenta poniendo esto en lugar de fpurge: __fpurge()
Otra cosa, fflush no está definido para el estandar de entrada sólo para el de salida. ¡Un saludo!
|
|
|
En línea
|
Regístrate en
|
|
|
Stakewinner00
|
el segundo código que pusiste lo compile con g++ y me funciono perfectamente, luego lo probé con gcc y ompila pero no funciona. No se por que pero prueba a compilar con g++. EDITO: Si colocas un getchar delante se arregla. printf("Which character is bigger?\n"); printf("Type a single character:"); a=getchar(); printf("Type another character:"); getchar(); b=getchar();
|
|
« Última modificación: 26 Enero 2013, 23:08 pm por Stakewinner00 »
|
En línea
|
|
|
|
0x3c
Desconectado
Mensajes: 108
learning, making mistakes, having fun
|
Intenta poniendo esto en lugar de fpurge: Código
__fpurge()
intente haciendo eso y obtuve esto: !bash-4.2# gcc greater2.c -o greater2 /tmp/ccs0xVLj.o: In function `main': greater2.c:(.text+0x2b): undefined reference to `_fpurge' collect2: error: ld returned 1 exit status
EDITO: Si colocas un getchar delante se arregla.
Código:
printf("Which character is bigger?\n"); printf("Type a single character:"); a=getchar(); printf("Type another character:"); getchar(); b=getchar();
si hago lo que dices si funciona: !bash-4.2# ./greater3 Which character is bigger? Type a single character:j Type another character:h 'j' is greater than 'h'!
pero por que? no se supone que getchar() espera input? saludos y gracias
|
|
|
En línea
|
Si Vis Pacem, Para Bellum.Another Legend Has Fallen
|
|
|
Stakewinner00
|
No se por que pasa, haber si alguno de los expertos que corren por aquí nos solventa el misterio.
A otra cosa no te recomiendo mucho usar este truco ya que si existen esas funciones sera siempre mejor intentarlas usarlas, pero alguna vez me paso lo mismo con cin.get() y también puse un cin.get() de más
PD:Tengo un libro de C escrito por un tal Gottfried y solo he leído 2 paginas, en mi opinión es mejor aprender a base de experiencia y luego mirar libros para rellenar los huecos vacíos.
|
|
|
En línea
|
|
|
|
0x3c
Desconectado
Mensajes: 108
learning, making mistakes, having fun
|
PD:Tengo un libro de C escrito por un tal Gottfried y solo he leído 2 paginas, en mi opinión es mejor aprender a base de experiencia y luego mirar libros para rellenar los huecos vacíos.
no puedo hacer mas que estar de acuerdo pero en mi caso ni mi trabajo ni mucho menos mi carrera tienen que ver con programar o hacer codigos...pero tengo planes para los que necesito dominar 'C' por lo menos a medias.... saludos
|
|
|
En línea
|
Si Vis Pacem, Para Bellum.Another Legend Has Fallen
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
Esto ocurre porque un salto de línea queda cojo en el buffer de entrada, depurando tu programa se ve esto en el buffer stdin(que en ese momento termina apuntando al primer 0A): 77A07EB1 00 00 00 00 00 00 00 00 ........ 77A07EB9 00 00 00 00 00 00 00 61 .......a 77A07EC1 0A 0A 00 00 00 00 00 00 ........ 77A07EC9 00 00 00 00 00 00 00 00 ........ 77A07ED1 00 00 00 00 00 00 00 00 ........ 77A07ED9 00 00 00 00 00 00 00 00 ........
Si te das cuenta los 0A son saltos de línea y al hacer input con scanf se escriben dos por alguna razón que desconozco , entonces al llamar otra vez a getchar y intentar escribir en la siguiente posición del buffer al haber un fin de línea pues es como si ya hubiese escaneado todo el buffer y pasa de largo. El buffer se vería así: 77A07EC2 0A 00 00 00 00 00 00 00 ........ 77A07ECA 00 00 00 00 00 00 00 00 ........ 77A07ED2 00 00 00 00 00 00 00 00 ........ 77A07EDA 00 00 00 00 00 00 00 00 ........ 77A07EE2 00 00 00 00 00 00 00 00 ........ 77A07EEA 00 00 00 00 00 00 00 00 ........ 77A07EF2 00 00 00 00 00 00 00 00 ........ 77A07EFA 00 00 00 00 00 00 00 00 ........ 77A07F02 00 00 00 00 00 00 00 00 ........
Y al hacer el siguiente getchar pues ya no habría problema porque apuntaría para escribir a la siguiente posición que es una zona vacía. Para evitar todo esto como ya dijo el moderador Eternal Idol hace mucho tiempo se usa fgets + sscanf. Ya que fgets lee desde un stream , n carácteres ( que le pasas como argumento) menos uno , entonces no lee el fin de línea. Un ejemplo de uso: #include <stdio.h> int main(int argc, char *argv[]) { char cadena[100]; char buffer[100]; return 0; }
|
|
« Última modificación: 27 Enero 2013, 00:27 am por avesudra »
|
En línea
|
Regístrate en
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
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: while(getchar()!='\n');/* este bucle debe ir despues de cada getchar*/
Saludos PD: fpurge no es estandar por eso no te funciona
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
mr.blood
Desconectado
Mensajes: 150
|
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 . #include <stdio.h> int main() { char a,b; printf("Which character is bigger?\n"); printf("Type a single character:"); setbuf(stdin , 0x0); // o fflush(stdin); printf("Type another character:"); if(a > b) { printf("'%c' is greater than '%c'!\n",a ,b ); } else if(b > a) { printf("'%c' is greater than '%c'!\n",b ,a ); } else { printf("Next time don't press the same character\n"); } return(0); }
Sa1uDoS
|
|
|
En línea
|
|
|
|
|
|