Intendo rimanere sul tema del '\n' "pendente" che rimane nello stream dopo che ne hai "estratto" l'intero. Quello per eliminare il quale, nella mia prima risposta, ho suggerito di aggiungere un getchar() dopo la scanf().
Comunque sia, per tagliare la testa al toro, ho provato in prima persona con questi risultati:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, cInt;
char c;
scanf( "%d", &n );
/*
nella scanf() qui sopra, ricevo l'intero in n e rimane un '\n' nello stream
*/
cInt = getchar();
/*
con questo getchar() verifico che in effetti c'era un '\n' "pendente" nello
stream (cInt riceve 10) e lo "elimino"
*/
scanf( "%d", &n );
getchar();
/*
cosi', con scanf() ricevo l'intero in n e '\n' rimane nello stream
con getchar() elimino quel '\n' dallo stream stesso, scartandolo
*/
scanf( "%d %c", &n, &c );
/*
nella scanf() qui sopra, ricevo l'intero in n e un carattere in c, e
rimane un '\n' nello stream (come effettivamente mi aspettavo, quello
spazio "guasta" il risultato, impedendo d'ottenere lo scopo che mi
prefiggevo di ottenere)
*/
cInt = getchar();
/*
con questo getchar() verifico che in effetti c'era un '\n' "pendente" nello
stream (cInt riceve 10) e lo "elimino"
*/
scanf( "%d%c", &n, &c );
/*
nella scanf() qui sopra, ricevo l'intero in n e '\n' in c, e nello stream
non rimane nulla; il risultato e' equivalente a usare scanf("%d",&n) e
getchar() in sequenza, che e' quello che volevo verificare
*/
return 0;
}