Alternativa a la función de biblioteca C fflush (stdin)

¿Alguien puede explicar cómo se puede explicar el siguiente código? Realmente no lo entiendo.

while((c = getchar()) != '\n' && c != EOF); 

Sé que se utiliza para vaciar la stream de entrada y que podría reemplazarse con la función estándar de biblioteca C:

 fflush(stdin) 

 while((c = getchar()) != '\n' && c != EOF); 

Esto lee los caracteres de entrada hasta que llega al final de la línea (es decir, getchar() devuelto '\n ) o al final del archivo o una condición de error (es decir, getchar() devuelve EOF ).

Si stdin está leyendo desde el teclado, descarta la entrada hasta que presione Entrar.

Si deja el control EOF , podría obtener un bucle infinito si se produce un error de entrada o si activa una condición de fin de archivo (en Unix, escribiendo Ctrl-D dos veces).

Esto podría ser útil, por ejemplo, después de usar scanf() para leer un número entero. Si ejecuta scanf("%d", &num); y escriba 123 , leerá esos 3 dígitos (y almacenará el valor 123 en n ), pero dejará todo a la espera de ser leído. La línea anterior se puede usar para omitir el rest de la línea de entrada.

(Una alternativa, probablemente mejor, es leer líneas enteras usando fgets() y analizarlas usando sscanf() .

Esto no es equivalente a fflush(stdin) . En lo que respecta al estándar C, llamar a fflush en una secuencia de entrada tiene un comportamiento indefinido.

Algunas implementaciones sí definen el comportamiento de fflush(stdin) . En sistemas que usan GNU libc, por ejemplo (la mayoría de los sistemas Linux):

Para las secuencias de entrada, fflush() descarta los datos almacenados en el búfer que se han recuperado del archivo subyacente, pero la aplicación no los ha consumido.

Eso no es lo mismo que descartar la entrada hasta el final de la línea. Y su uso hace que tu código no sea portátil.

Este código, suponiendo que el archivo (o alguna otra entrada) se haya abierto, continuará obteniendo carácter por carácter hasta que encuentre una nueva línea (\ n) o un final de archivo (eof).

fflush simplemente borrará la secuencia de un archivo abierto.