Programmer en langage C
60
© Éditions Eyrolles
●
gabarit maximal atteint (s’il y en a un de spécifié),
●
rencontre d’un caractère invalide, par rapport à l’usage qu’on veut en faire (par exemple un
point pour un entier, une lettre autre que E ou e pour un flottant,...). Notez bien l’aspect
relatif de cette notion de caractère invalide.
2.7 Arrêt prématuré de scanf
Voyez cet exemple, dans lequel nous utilisons, pour la première fois, la valeur de retour de la
fonction scanf.
compte = scanf ("%d^%d^%c", &n, &p, &c) ;
/* ^ désigne un espace */
12^25^b@
n = 12
p = 25
c = 'b'
compte = 3
12b@
n = 12
p inchangé
c inchangé
compte = 1
b@
n indéfini
p inchangé
c inchangé
compte = 0
La valeur fournie par scanf n’est pas comparable à celle fournie par printf puisqu’il s’agit
cette fois du nombre de valeurs convenablement lues. Ainsi, dans le premier cas, il n’est pas
surprenant de constater que cette valeur est égale à 3.
En revanche, dans le deuxième cas, le caractère b a interrompu le traitement du premier code %d.
Dans le traitement du deuxième code (%d), scanf a rencontré d’emblée ce caractère b, toujours
invalide pour une valeur numérique. Dans ces conditions, scanf se trouve dans l’incapacité
d’attribuer une valeur à p (puisque ici, contrairement à ce qui s’est passé pour n, elle ne dispose
d’aucun caractère correct). Dans un tel cas, scanf s’interrompt sans chercher à lire d’autres
valeurs et fournit, en retour, le nombre de valeurs correctement lues jusqu’ici, c’est-à-dire 1. Les
valeurs de p et de c restent inchangées (éventuellement indéfinies).
Dans le troisième cas, le même mécanisme d’arrêt prématuré se produit dès le traitement du
premier code de format, et le nombre de valeurs correctement lues est 0.
Ne confondez pas cet arrêt prématuré de scanf avec le troisième critère d’arrêt de traitement d’un code de format. En effet, les deux situations possèdent bien la même cause (un
caractère invalide par rapport à l’usage que l’on souhaite en faire), mais seul le cas où scanf
n’est pas en mesure de fabriquer une valeur conduit à l’arrêt prématuré.
Ici, nous avons vu la signification d’un espace introduit entre deux codes de format. En toute
rigueur, vous pouvez introduire à un tel endroit n’importe quel caractère de votre choix. Dans
ce cas, sachez que lorsque scanf rencontre un caractère (x par exemple) dans le format,
il le compare avec le caractère courant (celui désigné par le pointeur) du tampon. S’ils sont
égaux, il poursuit son travail (après avoir avancé le pointeur) mais, dans le cas contraire, il
y a arrêt prématuré. Une telle possibilité ne doit toutefois être réservée qu’à des cas bien
particuliers.
Delannoy Livre.book Page 60 Mercredi, 6. mai 2009 4:26 16
60
© Éditions Eyrolles
●
gabarit maximal atteint (s’il y en a un de spécifié),
●
rencontre d’un caractère invalide, par rapport à l’usage qu’on veut en faire (par exemple un
point pour un entier, une lettre autre que E ou e pour un flottant,...). Notez bien l’aspect
relatif de cette notion de caractère invalide.
2.7 Arrêt prématuré de scanf
Voyez cet exemple, dans lequel nous utilisons, pour la première fois, la valeur de retour de la
fonction scanf.
compte = scanf ("%d^%d^%c", &n, &p, &c) ;
/* ^ désigne un espace */
12^25^b@
n = 12
p = 25
c = 'b'
compte = 3
12b@
n = 12
p inchangé
c inchangé
compte = 1
b@
n indéfini
p inchangé
c inchangé
compte = 0
La valeur fournie par scanf n’est pas comparable à celle fournie par printf puisqu’il s’agit
cette fois du nombre de valeurs convenablement lues. Ainsi, dans le premier cas, il n’est pas
surprenant de constater que cette valeur est égale à 3.
En revanche, dans le deuxième cas, le caractère b a interrompu le traitement du premier code %d.
Dans le traitement du deuxième code (%d), scanf a rencontré d’emblée ce caractère b, toujours
invalide pour une valeur numérique. Dans ces conditions, scanf se trouve dans l’incapacité
d’attribuer une valeur à p (puisque ici, contrairement à ce qui s’est passé pour n, elle ne dispose
d’aucun caractère correct). Dans un tel cas, scanf s’interrompt sans chercher à lire d’autres
valeurs et fournit, en retour, le nombre de valeurs correctement lues jusqu’ici, c’est-à-dire 1. Les
valeurs de p et de c restent inchangées (éventuellement indéfinies).
Dans le troisième cas, le même mécanisme d’arrêt prématuré se produit dès le traitement du
premier code de format, et le nombre de valeurs correctement lues est 0.
Ne confondez pas cet arrêt prématuré de scanf avec le troisième critère d’arrêt de traitement d’un code de format. En effet, les deux situations possèdent bien la même cause (un
caractère invalide par rapport à l’usage que l’on souhaite en faire), mais seul le cas où scanf
n’est pas en mesure de fabriquer une valeur conduit à l’arrêt prématuré.
Ici, nous avons vu la signification d’un espace introduit entre deux codes de format. En toute
rigueur, vous pouvez introduire à un tel endroit n’importe quel caractère de votre choix. Dans
ce cas, sachez que lorsque scanf rencontre un caractère (x par exemple) dans le format,
il le compare avec le caractère courant (celui désigné par le pointeur) du tampon. S’ils sont
égaux, il poursuit son travail (après avoir avancé le pointeur) mais, dans le cas contraire, il
y a arrêt prématuré. Une telle possibilité ne doit toutefois être réservée qu’à des cas bien
particuliers.
Delannoy Livre.book Page 60 Mercredi, 6. mai 2009 4:26 16
