lenguaje - gets en c
cuál es el uso de fflush(stdin) en la programación c (3)
Tengo el siguiente programa
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ans[8];
int i;
for(i=1;i<=3;i++)
{
printf("/n What is the unit of traffic ?");
scanf("%s",ans);
fflush(stdin);
if(stricmp(ans,"Earlang")==0)
{
printf("/nAnswer is correct");
exit(1);
}
else
if(i<3)
printf("/n Try Again!/n");
}
printf("/n Nunit of traffic is Earlang:");
}
¿Cuál es el uso de fflush (stdin) en este programa?
Es una forma pocoportable de eliminar todos los datos del búfer de entrada hasta la próxima nueva línea. Lo he visto usado en casos como ese:
char c;
char s[32];
puts("Type a char");
c=getchar();
fflush(stdin);
puts("Type a string");
fgets(s,32,stdin);
Sin el fflush()
, si escribe un carácter, diga "a", y el hit ingrese, el buffer de entrada contiene "a / n", el getchar()
mira hacia la "a", pero el "/ n" permanece en el búfer, por lo que los próximos fgets()
lo encontrarán y devolverán una cadena vacía sin siquiera esperar la entrada del usuario.
Sin embargo, tenga en cuenta que este uso de fflush()
es poco práctico. Lo he probado ahora en una máquina Linux, y no funciona, por ejemplo.
No está en el estándar C, por lo que el comportamiento no está definido.
Algunas implementaciones lo usan para borrar el buffer stdin
.
Desde C11 7.21.5.2 La función fflush , fflush
solo funciona con flujo de salida / actualización, no flujo de entrada.
Si la ruta apunta a una secuencia de salida o una secuencia de actualización en la que no se ingresó la operación más reciente, la función fflush hace que todos los datos no escritos para esa transmisión se envíen al entorno de la computadora principal para que se escriban en el archivo; de lo contrario, el comportamiento no está definido.
borra el buffer stdin
antes de leer. Desde la página man:
Para flujos de salida, fflush () fuerza una escritura de todos los datos almacenados en el espacio de usuario para la salida o corriente de actualización dada a través de la función de escritura subyacente de la secuencia. Para flujos de entrada, fflush () descarta cualquier información almacenada en el búfer que se haya extraído del archivo subyacente, pero no ha sido consumida por la aplicación.
Nota: Esto es específico de Linux, el uso de fflush()
en las secuencias de entrada no está definido por el estándar, sin embargo, la mayoría de las implementaciones se comportan igual que en Linux.