6.2.2 Gestion du tampon par scanf

Icône de l'outil pédagogique Gestion du tampon par scanf

Deux tampons pour la saisie

Le fonctionnement de scanf s'explique par l'existence de deux tampons entre le clavier (c'est‐à‐dire le système d'exploitation) et le programme : le tampon système et le tampon du C. Les caractères entrés par l'utilisateur sont d'abord placés dans le tampon système ; ils ne sont copiés dans le tampon du C que lorsque l'utilisateur tape ENTRÉE. scanf va lire les informations qui lui sont nécessaires dans le tampon du C : les caractères sont retirés du tampon au fur et à mesure des conversions réussies vers les types de variables de destination. Il y a mise en attente seulement lorsque le tampon du C est vide (curseur clignotant à l'écran).

Une conversion non réussie (type de la variable d'accueil non adapté à la donnée) provoque un mauvais fonctionnement des lectures suivantes : la donnée incorrecte est présentée en réponse à toutes les interrogations scanf qui suivent, jusqu'à ce qu'elle soit absorbée par l'une d'elles, libérant ainsi le tampon du C.

De même, un excès de données en entrée perturbe les lectures suivantes : les caractères excédentaires restent dans le tampon et sont proposés en réponse aux interrogations scanf qui suivent.

 

Saisie de caractères : attention danger !

A la fin de la dernière conversion effectuée par une instruction scanf, il reste dans le tampon du C au moins le dernier caractère fin de ligne (caractère '\n' généré par la frappe de la touche ENTREE). Ce reliquat du tampon sera présenté lors de la prochaine interrogation scanf. Si scanf cherche à lire une valeur numérique, '\n' sera considéré comme un séparateur que scanf sautera naturellement ; par contre, si la première donnée que cherche à lire scanf est un caractère, celui‐ci sera automatiquement chargé avec '\n' et aucune interrogation ne sera affichée (pas de curseur clignotant)... Le programmeur doit donc prendre particulièrement garde à la gestion du tampon lors de la lecture de caractères : la solution est rewind.

 

Nettoyer le tampon avant la saisie : rewind

Les explications précédentes montrent qu'il est important de s'assurer que le tampon du C est nettoyé avant d'utiliser scanf, surtout lors de la lecture de caractères. C'est pourquoi la bibliothèque standard du C met à notre disposition une fonction rewind qui permet de vider le tampon du C. Sa syntaxe est :

rewind(stdin) ; /* vide le tampon avant une lecture */

stdin est le flux standard d'entrée, en principe la console. De même, le flux standard en sortie stdout représente généralement l'écran.
La fonction rewind peut souvent être remplacée par la fonction fflush (qui s'utilise de la même façon que rewind), mais celle‐ci n'est pas standard.

Exemple 40 : Lectures incorrectes par scanf et utilisation de rewind :