Programmer en langage C
62
© Éditions Eyrolles
Vous constatez que la seconde question (donnez une valeur pour p) est apparue à l’écran, mais
le programme n’a pas attendu que vous frappiez votre réponse pour vous afficher la suite. Vous
notez alors qu’il a bien pris pour p la seconde valeur entrée au préalable, à savoir 25.
En fait, comme nous l’avons vu, les informations frappées au clavier ne sont pas traitées instantanément par scanf mais mémorisées dans un tampon. Jusqu’ici, cependant, nous n’avions pas précisé quand scanf s’arrêtait de mémoriser pour commencer à traiter. Il le fait tout
naturellement à la rencontre d’un caractère de fin de ligne généré par la frappe de la touche
« return », dont le rôle est aussi classiquement celui d’une validation. Notez que, bien qu’il
joue le rôle d’une validation, ce caractère de fin de ligne est quand même recopié dans le
tampon ; il pourra donc éventuellement être lu en tant que tel.
L’élément nouveau réside donc dans le fait que scanf reçoit une information découpée en
lignes (nous appelons ainsi une suite de caractères terminée par une fin de ligne). Tant que son
traitement n’est pas terminé, elle attend une nouvelle ligne (c’est d’ailleurs ce qui se produisait
dans notre premier exemple dans lequel nous commencions par frapper « return »).
Par contre, lorsque son traitement est terminé, s’il existe une partie de ligne non encore utilisée,
celle-ci est conservée pour une prochaine lecture.
Autrement dit, le tampon n’est pas vidé à chaque nouvel appel de scanf. C’est ce qui explique
le comportement du programme précédent.
2.10 En cas d’erreur
Dans le cas de printf, la source unique d’erreur résidait dans les fautes de programmation.
Dans le cas de scanf, en revanche, il peut s’agir, non seulement d’une faute de programmation, mais également d’une mauvaise réponse de l’utilisateur.
2.10.1 Erreurs de programmation
Comme dans le cas de printf, ces erreurs peuvent être de deux types :
a) Code de format en désaccord avec le type de l’expression
Si le code de format, bien qu’erroné, correspond à un type de longueur égale à celle de la
lvalue mentionnée dans la liste, les conséquences se limitent, là encore, à l’introduction
d’une mauvaise valeur. Si, en revanche, la lvalue a une taille inférieure à celle correspondant au type mentionné dans le code format, il y aura écrasement d’un emplacement
mémoire consécutif à cette lvalue. Les conséquences en sont difficilement prévisibles.
b) Nombre de codes de format différent du nombre d’éléments de la liste
Comme dans le cas de printf, il faut savoir que scanf cherche toujours à satisfaire le
contenu du format. Les conséquences sont limitées dans le cas où le format comporte
moins de codes que la liste ; ainsi, dans cette instruction, on ne cherchera à lire que la
valeur de n :
scanf ("%d", &n, &p) ;
Delannoy Livre.book Page 62 Mercredi, 6. mai 2009 4:26 16
Précédent

- 75/281

Suivant