es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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>

Tags:  ,

Answer

  1. Avatar for 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 puntero NULL. 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 como NULL, la próxima llamada a fgets 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 devuelva NULL. Esto se puede hacer utilizando la función feof, de la siguiente manera:

    user_input = fgets(input_buf, BUFSIZE, stdin);
    if (user_input == NULL) {
        if (feof(stdin)) {
            /* Usuario ingresó la señal de EOF (Ctrl-d). */
            printf("¡Adiós!\n");
        } else {
            printf("Entrada inválida. Intenta de nuevo.\n");
        }
        continue;
    } else {
        printf("Entrada del usuario: %s", user_input);
        break;
    }
    

    Con esta modificación, el programa manejará correctamente la señal de EOF y saldrá del bucle.

Comments are closed.