Il consiglio di candaluar è ovviamente buono, però vorrei lo stesso riportare alcune mie osservazioni "empiriche" che potrebbero farti comodo. Siccome "io ci gioco, col codice, mica ci lavoro", prendi sempre con le pinze tutto quel che scrivo.
Credo che il problema nasca dal fatto che quando "leggi" un char dallo stream di input con "%c", ricevi effettivamente il primo carattere immesso. Quand'anche quel carattere fosse l'unico immesso intenzionalmente, resterebbe il fatto che quando si dà l'invio, in coda all'input viene comunque inserito anche un '\n'. Ora, mettiamo che tu scriva, in risposta alla domanda "Oggi piove?", soltanto una 's' per indicare "sì", quindi premi invio... al tuo programma arriva la sequenza "s\n", dalla quale tu con scanf() "prelevi" la 's'. E la '\n'? Quella resta "pendente" nello stream di input, per cui quando chiedi "Oggi nevica?" e chiami nuovamente scanf(), non hai neppure il tempo di digitare una risposta, perché quell' '\n' pendente entra in gioco e provoca il ritorno immediato da scanf() (ecco perché ti compare subito l'altra domanda, "Oggi grandina?"). Avrai notato che dopo "Oggi grandina?" il programma si arresta in attesa di un nuovo input, perché non c'è più niente nello stream dal momento che la scanf() precedente ha "consumato" il '\n' pendente. E' un po' confuso, ma spero d'essere riuscito a spiegarmi.
Anche con fgets() può succedere qualcosa di simile se "sfondi" il buffer, poiché fgets() per evitare di sovraccaricare il buffer lascia nello stream di input tutti i caratteri in eccesso. In quel caso, una successiva chiamata a fgets() finisce per accedere ai "residui" dell'immissione precedente, come nel caso di scanf().
Per evitare questo inconveniente son solito scrivere in coda a ogni chiamata a fgets() una riga con l'istruzione...
if( '\n' != *buffer[strlen(buffer)-1]) while( '\n' != getchar() );
Questo, ovviamente, se il troncamento dell'input è accettabile. In caso contrario occorre agire diversamente.
Un'altra cosa che mi ritrovo a dover fare spesso con fgets() è liberarmi del '\n' che viene aggiunto in fondo all'input. Di solito faccio così:
size_t lStr = strlen(buffer);
if( '\n' == buffer[lStr-1] ) buffer[--lStr] = '\0';
Buon divertimento!