Imaginons qu'on exécute ton programme, et qu'on tape : o<entrée>.
Le 'o' est lu par le getchar(), la condition du while est vrai, on boucle, tout va bien. Mais où passe le newline ? Et bien il ne passe nul part justement, il est lu par le getchar() suivant, le test du while est faux, et on quitte la boucle.
Le comportement de fflush n'est défini que pour les flux en écriture, donc pas pour stdin.