/ )
( 1
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
CHAPITRE IV
/ )
( 2
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
/ )
( 3
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
1) Les possibilités de la fonction printf
c (char) | caractère affiché « en clair » (convient à short ou à int compte tenu des conversions systématiques) |
d (int) | (convient aussi à char ou à short, compte tenu des conversions systématiques) |
u (unsigned int) | (convient aussi à unsigned char ou à unsigned short, compte tenu des conversions systématiques) |
ld (long) | long |
f (double / float) | (compte tenu des conversions systématiques float -> double) écrit en notation décimale avec six chiffres après le point (1.234500 ou 123.456789) |
e (double / float) | (compte tenu des conversions systématiques float -> double) écrit en notation exponentielle (mantisse entre 1 inclus et 10 exclu) avec six chiffres après le point décimal, (x.xxxxxxe+yyy ou x.xxxxxxe-yyy pour les nombres positifs) (-x.xxxxxxe+yyy ou -x.xxxxxxe-yyy pour les nombres négatifs) |
s | Chaîne de caractères dont on fournit l’adresse (sera étudiée ultérieurement) |
/ )
( 4
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
1) Les possibilités de la fonction printf
printf ("%3d", n) ; /* entier avec 3 caractères minimum */
n = 20 ^20
n = 3 ^^3
n = 2358 2358
n = -5200 -5200
printf ("%f", x) ; /* notation décimale gabarit par défaut */
/* (6 chiffres après point) */
x = 1.2345 1.234500
x = 12.3456789 12.345679
/ )
( 5
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
1) Les possibilités de la fonction printf
printf ("%10f", x) ; /* notation décimale - gabarit mini 10 */
/* (toujours 6 chiffres après point) */
x = 1.2345 ^^1.234500
x = 12.345 ^12.345000
x = 1.2345E5 123450.000000
printf ("%e", x); /*notation exponentielle -gabarit par défaut*/
/* (6 chiffres après point) */
x = 1.2345 1.234500e+000
x = 123.45 1.234500e+002
x = 123.456789E8 1.234568e+010
x = -123.456789E8 -1.234568e+010
/ )
( 6
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
1) Les possibilités de la fonction printf
printf ("%10.3f", x) ; /* notation décimale, gabarit mini 10 */
/* et 3 chiffres après point */
x = 1.2345 ^^^^^1.235
x = 1.2345E3 ^^1234.500
x = 1.2345E7 12345000.000
printf ("%12.4e", x); /*notation exponentielle, gabarit mini 12*/
/* et 4 chiffres après point */
x = 1.2345 ^1.2345e+000
x = 123.456789E8 ^1.2346e+010
/ )
( 7
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
1) Les possibilités de la fonction printf
printf ("%8.*f", n, x) ;
n = 1 x = 1.2345 ^^^^^1.2
n = 3 x = 1.2345 ^^^1.234
n = printf ("....", ....)
/ )
( 8
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
1) Les possibilités de la fonction printf
Exemple, lorsque l’on écrit une valeur de type int en %u ou une valeur de type unsigned int en %d
Si des expressions de la liste n’ont pas de code format, elles ne seront pas affichées
printf ("%d", n, p) ; /* p ne sera pas affichée */
/ )
( 9
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
1) Les possibilités de la fonction printf
printf ("%d %d ", n) ; /*la valeur de la seconde est aléatoire*/
/ )
( 10
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
1) Les possibilités de la fonction printf
Son exécution est toutefois plus rapide, dans la mesure où elle ne fait pas appel au mécanisme d’analyse de format.
/ )
( 11
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
2) Les possibilités de la fonction scanf
c | char |
d | int |
u | unsigned int |
hd | short int |
hu | unsigned short |
ld | long int |
lu | unsigned long |
f ou e | float : décimale (éventuellement sans point, c’est-à-dire comme un entier) ou exponentielle (avec la lettre e ou E) |
lf ou le | double avec la même présentation que ci-dessus |
s | chaîne de caractères dont on fournit l’adresse |
/ )
( 12
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
2) Les possibilités de la fonction scanf
Lorsque scanf attend que vous lui fournissiez des données, l’information frappée au clavier est rangée temporairement dans l’emplacement mémoire nommé « tampon ».
la mémoire tampon est exploré, caractère par caractère par scanf, au fur et à mesure des besoins. Il existe un pointeur qui précise quel est le prochain caractère à prendre en compte.
D’autre part, certains caractères dits « séparateurs » (ou « espaces blancs ») jouent un rôle particulier dans les données. Les deux principaux sont l’espace et la fin de ligne (\n)
/ )
( 13
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
2) Les possibilités de la fonction scanf
Tout les codes de format (excepté %c et %s) entraînent l’avancement du pointeur jusqu’au premier caractère différent d’un séparateur
Puis scanf prend en compte tous les caractères suivants jusqu’à la rencontre d’un séparateur (en y plaçant le pointeur)
Le code de format %c entraîne la prise en compte du caractère désigné par le pointeur (même s’il s’agit d’un séparateur comme espace ou fin de ligne), et le pointeur est simplement avancé sur le caractère suivant du tampon
scanf ("%d%d", &n, &p) ;
12^25@ n = 12 p = 25
^12^^25^^@ n = 12 p = 25
12@
@
^25@ n = 12 p = 25
/ )
( 14
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
2) Les possibilités de la fonction scanf
Exemples, soit n(int) et p(int) et c(char) (^ désigne un espace et @ une fin de ligne)
scanf ("%c%d", &c, &n) ;
a25@ c = 'a' n = 25
a^^25@ c = 'a' n = 25
scanf ("%d%c", &n, &c) ;
12^a@ n = 12 c = ' '
/ )
( 15
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
2) Les possibilités de la fonction scanf
Dans un code de format de scanf, on peut préciser un gabarit.
Dans ce cas, le traitement d’un code de format s’interrompt soit à la rencontre d’un séparateur, soit lorsque le nombre de caractères indiqués a été atteint (attention, les séparateurs éventuellement sautés auparavant ne sont pas comptabilisés !)
scanf ("%3d%3d", &n, &p)
12^25@ n = 12 p = 25
^^^^^12345@ n = 123 p = 45
12@
25@ n = 12 p = 25
/ )
( 16
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
2) Les possibilités de la fonction scanf
Un espace entre deux codes de format demande à scanf de faire avancer le pointeur au prochain caractère différent d’un séparateur.
C’est ce qui se passe lorsque l’on a affaire à un code de format correspondant à un type numérique.
En revanche, cela n’était pas le cas pour les caractères
scanf ("%d^%c", &n, &c) ; /* ^ désigne un espace */
/* %d^%c est différent de %d%c */
12^a@ n = 12 c = 'a'
12^^^a@ n = 12 c = 'a'
12@a@ n = 12 c = 'a'
/ )
( 17
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
2) Les possibilités de la fonction scanf
Lors du traitement du code %d, scanf rencontre les caractères 1, puis 2, puis a.
Ce caractère a ne convenant pas à la fabrication d’une valeur entière, scanf interrompt son exploration et fournit donc la valeur 12 pour n.
L ’espace qui suit %d dans le format n’a aucun effet puisque le caractère courant est le caractère a (différent d’un séparateur).
Le traitement du code %c amène scanf à prendre ce caractère courant (a) et à l’affecter à la variable c.
scanf ("%d^%c", &n, &c) ; /* ^ désigne un espace */
12a@ n = 12 c = 'a'
/ )
( 18
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
2) Les possibilités de la fonction scanf
/ )
( 19
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
2) Les possibilités 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
indéfini indéfini
b@ n inchangé p inchangé c inchangé compte = 0
indéfini indéfini indéfini
/ )
( 20
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
2) Les possibilités de la fonction scanf
Si le code de format correspond à un type de longueur égale à celle de la lvalue mentionnée dans la liste, les conséquences se limitent à l’introduction d’une mauvaise valeur
Si 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
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 :
Dans le cas où le format comporte plus de codes que la liste, on cherchera à affecter des valeurs à des emplacements (presque) aléatoires de la mémoire.
scanf ("%d", &n, &p) ;
/ )
( 21
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
2) Les possibilités de la fonction scanf
donnez un nombre : 12
voici son carré : 144
donnez un nombre : &
voici son carré : 144
donnez un nombre : voici son carré : 144
donnez un nombre : voici son carré : 144
donnez un nombre : voici son carré : 144
donnez un nombre : voici son carré : 144
^C
main() {
int n ;
do
{ printf ("donnez un nombre : ") ;
scanf ("%d", &n) ;
printf ("voici son carré : %d\n", n*n) ;
}
while (n) ; }
/ )
( 22
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
2) Les possibilités de la fonction scanf
tout en étant plus rapide puisque ne faisant pas appel au mécanisme d’analyse d’un format.
/ )
( 23
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
Exercice 1
1) Quels résultats fournit le programme suivant ?
#include <stdio.h>
main ()
{ int n = 543 ;
int p = 5 ;
float x = 34.5678;
printf ("A : %d %f\n", n, x) ;
printf ("B : %4d %10f\n", n, x) ;
printf ("C : %2d %3f\n", n, x) ;
printf ("D : %10.3f %10.3e\n", x, x) ;
printf ("E : %*d\n", p, n) ;
printf ("F : %*.*f\n", 12, 5, x) ;
}
Exercice 1 :
A : 543 34.567799
B : 543 34.567799
C : 543 34.567799
D : 34.568 3.457e+001
E : 543
F : 34.56780
/ )
( 24
Langage C
I. II. III. IV. V. VI. VII. VIII. IX.
Les entrées-sorties conversationnelles
Exercice 2
2) Quelles seront les valeurs lues dans les variables n et p (de type int), par l’instruction suivante ?
scanf ("%4d %2d", &n, &p) ;
lorsqu’on lui fournit les données suivantes (le symbole ^ représente un espace et le symbole @ représente une fin de ligne, c’est-à-dire une validation) ?
a) 12^45@
b) 123456@
c) 123456^7@
d) 1^458@
e) ^^^4567^^8912@