cuando usas scanf para leer un entero, esta funcion lee hasta el ultimo digito que encuentra y luego deja todo lo demas en el buffer de entrada. por ejemplo, si yo introdujera los siguientes caracteres cuando lo pidiera el scanf:
123fg45'\n' ('\n' ya que picas enter para introducir los datos y tambien se almacena en el bufer)
el scanf() leeria 123, y dejaria fg45'\n' en el buffer de entrada. esto es asi por propia definicion de la funcion scanf(). si quieres prueba este ejemplo y compruebalo por ti mismo:
#include <stdio.h>
int main() {
int a;
char b[50];
//limpiarstdin();
return 0;
}
sabiendo esto, puedes tambien comprobar que cuando usas gets(), esta lee en el bufer de entrada y ahi si que hay el caracter '\n', por lo que no te dara opcion a introducir nada y se recogera la basura que habia quedado en el bufer tras el scanf() hasta el caracter de nueva linea.
por cierto, esa funcion para eliminar la basura esta bien, aunque no limpiara del todo el bufer cuando haya una larga cola de basura (en tu caso, mayor a 80 caracteres). una alternativa es usar la siguiente funcion:
void limpiarstdin() {
char a;
}
la cual si que limpiara del todo sea cual sea la longitud de basura.
un saludo!