¿Limpiando el buffer stdin?

Estaba escribiendo algo de código y usé fgets para obtener la entrada del usuario. Y luego escribí un bucle sobre mi código para seguir pidiendo la entrada del usuario hasta que el usuario imprima Salir. Pero la segunda vez que lo pidió, escribió “Por favor, ingrese su entrada” 2 veces en lugar de 1, y no esperó mi entrada la primera vez. Entonces, lo busqué en Google y encontré que el búfer estándar se llenó y tuvo que ser borrado. Encontré esta solución:

void dump_line(FILE * fp) { int ch; while ((ch = fgetc(fp)) != EOF && ch != '\n') { /* null body */; } } 

y luego llamando desde la función principal:

 dump_line(stdin); 

Me cuesta mucho entenderlo. Como lo entiendo, simplemente asigna a “ch” el valor de fgetc (stdin) .. Simplemente no puedo entender cómo asignar fgetc (stdin) a “ch” borra el búfer. ¡Muchas gracias por su ayuda!

Aquí hay un fragmento antiguo que estoy usando para la entrada del usuario si realmente necesito hacerlo en C puro:

 int get_line(char *buffer, int bsize) { int ch, len; fgets(buffer, bsize, stdin); /* remove unwanted characters from the buffer */ buffer[strcspn(buffer, "\r\n")] = '\0'; len = strlen(buffer); /* clean input buffer if needed */ if(len == bsize - 1) while ((ch = getchar()) != '\n' && ch != EOF); return len; } 

Recupera la cantidad de letras de bsize estándar de stdin y las almacena en un búfer dado. Las cosas que queden en el buffer de entrada estándar se limpiarán automáticamente . También elimina las nuevas líneas (\ r y \ n) de los datos de entrada.

La función devuelve la cantidad de caracteres leídos con éxito.

simplemente asigna a “ch” el valor de fgetc (stdin)

Llamar a fgetc tiene el efecto secundario de que un carácter se lee y se elimina de esa secuencia de archivos.

Asignar fgetc(stdin) a ch no es lo que borra el búfer. Es la llamada real de fgetc(stdin) que lo hace. Cada llamada (y por lo tanto, cada iteración del bucle) come una char de stdin .

Cómo funciona:

  1. Llame a fgetc(stdin) , y asigne el resultado a ch .
  2. Si ch no es igual a EOF o '\n' , vaya a 1.

Cuando el bucle se detenga, una de las dos cosas será verdadera: o acabas de comer el carácter que marca el final de la línea actual (lee: estás en la siguiente línea ahora), o la stdin está vacía y no lo harás t obtener más entrada. (Este último es casi inusual en una aplicación interactiva, pero es común cuando las personas introducen contenido en su aplicación desde otro lugar. Prepárese para ello).

fgetc() obtiene un carácter del búfer. Este código lee los caracteres del búfer hasta que se alcanza el final del archivo o una nueva línea.

Este es el mismo bucle, pero escrito de manera diferente, tal vez esto lo explique:

 void dump_line(FILE * fp) { /* dump a line from fp */ int ch; /* temporary storage for character */ while (1) { ch = fgetc(fp); /* read char from fp, this removes it from the stream */ if (ch == EOF) /* break if we reached END-OF-FILE */ break; if (ch == '\n') /* break if we reached a newline, because */ break; /* we have succesfully read a line */ } } 

Otro ejemplo para borrar el búfer:

 char ch[1]; while(1){ ch[0] = fgetc(stdin); if(ch[0] == '\n' || ch[0] == EOF) break; }