Per le fgets basta che aggiungi undopo ogni scanf che precede un fgets...codice:while(getchar()!='\n');
Ciò succede perchè scanf non consuma tutti i caratteri in input, ma solo quelli di cui necessita, perciò devi eliminare tutti i caratteri restanti fino al ritorno a capo ('\n') compreso...