Cuando capturas una frase que contenga espacios el %s de scanf adquiere datos hasta llegar al primer espacio en blanco.
Los datos restantes quedarán en el buffer y al volver a usar scanf adquirirá desde la última posición en que quedó.
Nosotros, al concluir un escrito con la tecla RETURN, añadimos al final de todo un carácter de nueva línea '\n' y eso lo podemos usar como marcador de final de buffer stdin.
hacemos que getchar vaya adquiriendo (y quitando) caracteres de uno en uno del buffer hasta que encuentre el de nueva línea, momento en que el bucle while se detendrá y el bucle quedará vacío.