SoloCodigo
Programación General => C/C++ => Mensaje iniciado por: fredes en Lunes 6 de Septiembre de 2004, 20:20
-
Hola a todos:
Estoy programando C de forma basica sobre Linux con gcc. He leido que la funcion fflush(stdin) no limpia el buffer de entrada en Linux y que solo vacia los streams de salida.
Pregunto si es esto cierto y en caso de que lo sea que otra solucion puedo encontrar para vaciar el buffer de entrada.
Muchas gracias y un saludo
-
si lo que tienes es el problema de que al digitatr muchas teclas en veza de una el programa 'guarda' esa infromacion y depues las procesa una por una... te puedo ayudar.. cuanteme puntualmente tu problema.
-
por ejemplo si hago:
scanf("%c",&a);
.......
scanf("%c",&b);
No me pide una entrada por teclado en el segundo scanf (se lo salta) porque queda el retorno de carro en el buffer. Si meto un getchar() por el medio funciona, pero me gustaria tener una solucion similar a la que uso en Windows que es la funcion fflush(stdin).
Espero explicarme y muchas gracias por la respuesta
-
prueba a poner el fflush(stdin) justo antes del segundo (o el numero k sea) scanf()
-
ese fflsh(stdin)
ya no se ni cunado funciona ya que en visual c++ .net tambien presenta problemas la solucion...
no hay.
no metiras si hay..
es esta:
1- No uses scanf usa gets
2- deja que gets capture un buffer.. es decir que sea capaz de capturar un numero razonable de caracteres posiblemente 50
3- una vez capturada la entrada del teclado hace la asignacion de solo el primer caracter eliminando de este modo , o mejor ignorando el resto de los caracteres.
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
char buffer[5]={'\0','\0','\0','\0','\0'};
char opcion, opcion2;
gets(buffer);
opcion =buffer[0];
...
...
...
gets(buffer);
opcion2 =buffer[0];
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
-
Me parece bien eso,
todas las soluciones que me han dado coinciden con hacer algo así, o sea leer el buffer un número considerable de caracteres para dejarlo vacío o no utilizar las funciones que puedan dar problemas (scanf("%c" ,&c), porque efectivamente fflush(stdin) para Linux no hace nada. En TurboC por ejemplo, si.
Muchas gracias a todos por la ayuda y saludos
-
LO QUE PASA ES QUE SI USAS SCANF te volevraa fallar cuando digiten espacios.
-
Hola!!!!!!!!!!!!
El uso de gets no es recomendado. Yo lo use y lo uso pero hay q tener cuidado:
Miren esto (http://www.linuxinfor.com/spanish/man3/gets.html)
exactamente esta parte lean:
FALLOS
Puesto que es imposible saber, sin conocer de antemano los datos, cuántos caracteres va a leer gets(), y puesto que gets() continuará guardando caracteres una vez alcanzado el final del búfer, su empleo es extremadamente peligroso. Muchas veces ha sido utilizado para comprometer la seguridad de un sistema. En su lugar emplee fgets() siempre que pueda.
De ultima se puede ir obteniendo de aun acaracter a la vez hasta un Enter por ejemplo.
Salu2!!!!!
-
Pués es verdad, de hecho el compilador gcc da un warning a la hora de compilar con gets.
Lo del scanf pués si con que dará problemas pero con la solución tipo a la de JuanK de vaciar el buffer leyendo no tiene problema, no?
-
salvo por lo del gets claro...la verdad que odio la E/S