È la solita storia del mischiare input formattato con input non formattato... la scanf lascia nel buffer di lettura il \n finale (perché non lo riconosce come numero); questo non è un problema per successive chiamate a scanf (che lo ignorano automaticamente), ma la fgets inizia a leggere, incontra subito il \n e quindi considera il lavoro finito.
La cosa più semplice da fare è cambiare la scanf in:
codice:
scanf("%d\n", &i);
in modo che si "mangi" anche il newline.