Paulop: dans les applications où on a besoin d'être fin sur ce qu'on récupère, c'est effectivement un bien meilleur réflexe que de passer par les fonctions que tu cites.
guyver2: non, scanf NE vide PAS. Il se contente juste de retirer ce qui est en adéquation avec ses attentes. Vider, pour moins, ça veut dire qu'il ne reste plus rien.
Quant aux garanties :
1) tu sais combien des tes variables ont une valeur cohérente (c'est retourner par scanf)
2) par toujours du principe qu'après un scanf, le buffer de stdin est non-vide (à moins de demander un %s, tu peux toujours taper une entrée qui conduira à un buffer non-vide).