Un programa C sin un valor de retorno dará como resultado un comportamiento indefinido (que se considera unánimemente como una cosa mala ©). Al compilador se le permite rienda suelta en lo que devuelve aquí, parece devolver el resultado de scanf() pero podría estar devolviendo algo de entropía atmosférica para todos los cuidados de C Standard.
En cuanto a la línea que no se imprime, eso se debe a que está utilizando printf() en un terminal con búfer, querrá agregar \ n al final. La razón de esto se remonta a las antiguas formas de Unix que hace tiempo que han sido olvidadas por todos menos los sabios de los gurús de Unix.
Como no pasa nada hasta que ingresa algo, eso es porque scanf() bloquea hasta que se recibe la entrada, en caso de que no lo supiera. Es posible utilizar llamadas IO no bloqueantes, pero no estoy seguro de si eso está dentro del alcance de su pregunta. (Por favor, defina "hacer esto bien").
un buen libro C sería un buen lugar para comenzar ... – Nim
Tengo este problema, ¿resuelve tu problema? –