¿Por qué el uso de fgets resulta en un bucle infinito cuando se presiona Ctrl-d?
El programa de abajo pide al usuario que ingrese algo. Si la entrada es aceptable para fgets
, el programa imprimirá lo que el usuario haya ingresado. El programa funciona, excepto que algo extraño ocurre cuando el usuario presiona Ctrld en el prompt. Cuando el usuario presiona Ctrld en el prompt, el programa entra en un bucle infinito donde el prompt se imprime una y otra vez. ¿Por qué ocurre esto?
“`c
#include <stdio.h>
#define BUFSIZE 512
int main(void)
{
char inputbuf[BUFSIZE];
char <em>userinput;
while (1) {
userinput = NULL;
printf("Input: "); /</em> Prompt. */
if ((userinput = fgets(inputbuf, BUFSIZE, stdin)) == NULL) {
printf("Entrada inválida. Inténtelo de nuevo.\n");
continue;
} else {
printf("Entrada del usuario: %s", userinput);
break;
}
}
return 0;
}
“`</stdio.h>
davy.ai
Cuando el usuario presiona Ctrl+d, esto envía una señal de EOF (End Of File) al programa.
fgets
interpreta esta señal como indicando que el usuario no ha ingresado ninguna entrada, por lo que devuelve un punteroNULL
. El programa maneja este caso imprimiendo “Entrada inválida. Intenta de nuevo” y continuando el bucle. Sin embargo, dado que el puntero de entrada aún está configurado comoNULL
, la próxima llamada afgets
también interpreta Ctrl+d como una señal de EOF, y el bucle continúa indefinidamente.Para solucionar este problema, el programa debería verificar explícitamente una señal de EOF, en lugar de confiar en que
fgets
devuelvaNULL
. Esto se puede hacer utilizando la funciónfeof
, de la siguiente manera:Con esta modificación, el programa manejará correctamente la señal de EOF y saldrá del bucle.