Il existe dans la bibliothèque standard une fonction de lecture formattée qui
fonctionne selon le même principe que la procédure printf.
Sa syntaxe d'utilisation est la suivante :
scanf ( format ,
liste-d'expressions ) ;
format est une chaîne de caractères indiquant sous forme de séquences
d'échappement les entités que scanf lit sur l'entrée standard :
%d
pour un nombre décimal ;
%x
pour un nombre écrit en hexadécimal ;
%c
pour un caractère.
scanf("%d %x",&i,&j);cette instruction va lire un nombre écrit en décimal et mettre sa valeur dans la variable i, puis lire un nombre écrit en hexadécimal et mettre sa valeur dans la variable j. On aura remarqué que les paramètres i et j ont étés passés par adresse à scanf. Si l'entrée standard commence par un nombre décimal non suivi d'un nombre hexadécimal, seul
i
recevra une valeur.
Si l'entrée standard ne commence pas par un nombre décimal, ni i
ni j ne recevront de valeur.
scanf
rend EOF
, sinon
elle rend le nombre de variables qu'elle a pu affecter.
&
devant
les paramètres de scanf.
C'est une erreur difficile à détecter car le compilateur ne donnera aucun
message d'erreur et à l'exécution, ce sont les valeurs de i et
j qui seront interprétées comme des adresses par scanf.
Avec un peu de chance ces valeurs seront des adresses invalides, et le
programme s'avortera3.2 sur l'exécution du scanf, ce qui donnera une
idée du problème.
Avec un peu de malchance, ces valeurs donneront
des adresses parfaitement acceptables, et le scanf s'exécutera
en allant écraser les valeurs d'autres variables qui ne demandaient rien
à personne.
Le programme pourra s'avorter beaucoup plus tard, rendant très difficile la
détection de l'erreur.