No se si una vez invocado un getc() puede salirse de él sin recibir nada como no sea con algún tipo de timeout, pero al menos en CCS C, no se si en otros compiladores, tenemos el kbhit() que te devuelve true si hay algún dato esperando ser recibido. Así puedes llamar a getc() sólo cuando realmente vas a recibir algo.
Este código que he puesto nunca se para a menos que reciba algo y tampoco se para realmente ya que el getc() sólo se ejecuta el tiempo suficiente como para leer el dato e inmediatamente continúa.
No se si te servirá de algo
