Introduction
Jusqu'ici, nous avons utilisé de façon intuitive les fonctions printf pour afficher des informations à l'écran.
Nous vous proposons maintenant d'étudier en détail les différentes possibilités de ces fonctions, ce qui
nous permettra de répondre à des questions telles que :
• quelles sont les écritures "autorisées" pour des nombres fournis en données ? Que se passe-t-il
lorsque l'utilisateur ne les respecte pas ?
• comment organiser les données lorsque l'on mélange les types numériques et les types caractères ?
• que se produit-il lorsque, en réponse à scanf, on fournit trop ou trop peu d'informations ?
• comment agir sur la présentation des informations à l'écran ?
Les possibilités de la fonction printf()
Nous avons déjà vu que le premier argument de printf est une chaîne de caractères qui spécifie à la fois
des caractères à afficher tels quels, des "codes de format" repérés par %. Un "code de conversion" (tel que
c, d ou f) y précise le type de l'information à afficher.
D'une manière générale, il existe d'autres caractères de conversion soit pour d'autres types de valeurs, soit
pour agir sur la précision de l'information que l'on affiche. De plus, un code de format peut contenir des
informations complémentaires agissant sur le "cadrage", le "gabarit" ou la "précision". Ici, nous nous
limiterons aux possibilités les plus usitées de printf1. Sachez toutefois que le paragraphe 1.2 de l'annexe
A vous en fournit un panorama complet.
La syntaxe de printf
D'une manière générale, nous pouvons dire que l'appel à printf se présente ainsi :
printf ( format, liste_d'expressions )
format :
• constante chaîne (entre " "),
• pointeur sur une "chaîne de caractères" (cette notion sera étudiée ultérieurement).
liste_d'expressions : suite d'expressions séparées par des virgules d'un type en accord avec le code format
correspondant.
Les principaux codes de conversion
c char : caractère affiché (convient aussi à short ou à int compte tenu des conversions systématiques)
d int (convient aussi à char ou à int, compte tenu des conversions systématiques)
u unsigned int (convient aussi à unsigned char ou à unsigned short, compte tenu des conversions
systématiques)
ld long
lu unsigned long
Langage C
12
f double ou float (compte tenu des conversions systématiques float -> double) écrit en notation
"décimale" avec six chiffres après le point (par exemple : 1.234500 ou 123.456789)
Action sur le gabarit d'affichage
Par défaut, les entiers sont affichés avec le nombre de caractères nécessaires (sans espaces avant ou après).
Les flottants sont affichés avec six chiffres après le point (aussi bien pour le code e que f).
Un nombre placé après % dans le code de format précise un gabarit d'affichage, c'est-à-dire un nombre
minimal de caractères à utiliser. Si le nombre peut s'écrire avec moins de caractères, printf le fera
précéder d'un nombre suffisant d'espaces ; en revanche, si le nombre ne peut s'afficher convenablement
dans le gabarit imparti, printf utilisera le nombre de caractères nécessaires.
Voici quelques exemples, dans lesquels nous fournissons, à la suite d'une instruction printf, à la fois des
valeurs possibles des expressions à afficher et le résultat obtenu à l'écran. Notez que le symbole ^
représente un espace.
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
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
Actions sur la précision
Pour les types flottants, on peut spécifier un nombre de chiffres (éventuellement inférieur à 6) après le
point décimal (aussi bien pour la notation décimale que pour la notation exponentielle). Ce nombre doit
apparaître, précédé d'un point, avant le code de format (et éventuellement après le gabarit). Voici
quelques exemples :
printf ("%10.3f", x) ;
• x = 1.2345
^^^^^1.235
• x = 1.2345E3
^^1234.500
Langage C
13
• x = 1.2345E7
12345000.000
En cas d'erreur de programmation
Deux types d'erreur de programmation peuvent apparaître dans l'emploi de printf.
1. Code de format en désaccord avec le type de l'expression
Lorsque le code de format, bien qu'erroné, correspond à une information de même taille (c'est-à-dire
occupant la même place en mémoire) que celle relative au type de l'expression, les conséquences de
l'erreur se limitent à une "mauvaise interprétation de l'expression". C'est ce qui se passe, par exemple,
lorsque l'on écrit une valeur de type int en %u ou une valeur de type unsigned int en %d.
En revanche, lorsque le code format correspond à une information de taille différente de celle relative au
type de l'expression, les conséquences sont généralement plus désastreuses, du moins si d'autres valeurs
doivent être affichées à la suite. En effet, tout se passe alors comme si, dans la "suite d'octets"
(correspondant aux différentes valeurs à afficher) reçue par printf, le "repérage" des emplacements des
valeurs suivantes se trouvait soumis à un "décalage".
2. Nombre de codes de format différent u nombre d'expressions de la liste
Dans ce cas, il faut savoir que C cherche toujours à satisfaire le contenu du format.
Ce qui signifie que, si des expressions de la liste n'ont pas de code format, elles ne seront pas affichées.
C'est le cas dans cette instruction où la valeur de p ne sera pas affichée : printf ("%d", n, p) ;
En revanche, si vous prévoyez trop de codes de format, les conséquences seront là encore assez
désastreuses puisque printf cherchera à afficher... n'importe quoi. C'est le cas dans cette instruction où
deux valeurs seront affichées, la seconde étant (relativement) aléatoire : printf ("%d %d ", n) ;
La macro putchar
L'expression :
putchar (c)
joue le même rôle que :
printf ("%c", c) ;
Les possibilités de la fonction scanf
La syntaxe de scanf
D'une manière générale, l'appel de scanf se présente ainsi :
scanf ( format, liste_d_adresses)
format :
-constante chaîne (entre " "),
-pointeur sur une "chaîne de caractères" (cette notion sera étudiée ultérieurement)
liste_d_adresses : liste de "lvalue", séparées par des virgules, d'un type en accord avec le code de format
correspondant.
Les principaux codes de conversion de scanf
Pour chaque code de conversion, nous précisons le type de la "lvalue" correspondante.
Langage C
14
c char
d int
u unsigned int
hd short int
hu unsigned short
ld long int
lu unsigned long
f ou e float écrit indifféremment dans l'une des deux notations : décimale 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 (notion qui sera étudiée ultérieurement)
Remarque :
Contrairement à ce qui se passait pour printf, il ne peut plus y avoir ici de conversion automatique
puisque l'argument transmis à scanf est l'adresse d'un emplacement mémoire. C'est ce qui justifie
l'existence d'un code hd par exemple pour le type short ou encore celle des codes lf et le pour le type
double.
Action sur le gabarit
Comme dans les codes de format de printf, on peut, dans un code de format de scanf, 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.
La macro getchar
L'expression : c = getchar() joue le même rôle que : scanf ("%c", &c) tout en étant plus rapide puisque ne
faisant pas appel au mécanisme d'analyse d'un format. Notez bien que getchar utilise le même tampon
(image d'une ligne) que scanf. En toute rigueur, getchar est une "macro" (comme putchar) dont les
instructions figurent dans stdio.h. Là encore, l'omission d'une instruction #include appropriée conduit à
une erreur à l'édition de liens.
Jusqu'ici, nous avons utilisé de façon intuitive les fonctions printf pour afficher des informations à l'écran.
Nous vous proposons maintenant d'étudier en détail les différentes possibilités de ces fonctions, ce qui
nous permettra de répondre à des questions telles que :
• quelles sont les écritures "autorisées" pour des nombres fournis en données ? Que se passe-t-il
lorsque l'utilisateur ne les respecte pas ?
• comment organiser les données lorsque l'on mélange les types numériques et les types caractères ?
• que se produit-il lorsque, en réponse à scanf, on fournit trop ou trop peu d'informations ?
• comment agir sur la présentation des informations à l'écran ?
Les possibilités de la fonction printf()
Nous avons déjà vu que le premier argument de printf est une chaîne de caractères qui spécifie à la fois
des caractères à afficher tels quels, des "codes de format" repérés par %. Un "code de conversion" (tel que
c, d ou f) y précise le type de l'information à afficher.
D'une manière générale, il existe d'autres caractères de conversion soit pour d'autres types de valeurs, soit
pour agir sur la précision de l'information que l'on affiche. De plus, un code de format peut contenir des
informations complémentaires agissant sur le "cadrage", le "gabarit" ou la "précision". Ici, nous nous
limiterons aux possibilités les plus usitées de printf1. Sachez toutefois que le paragraphe 1.2 de l'annexe
A vous en fournit un panorama complet.
La syntaxe de printf
D'une manière générale, nous pouvons dire que l'appel à printf se présente ainsi :
printf ( format, liste_d'expressions )
format :
• constante chaîne (entre " "),
• pointeur sur une "chaîne de caractères" (cette notion sera étudiée ultérieurement).
liste_d'expressions : suite d'expressions séparées par des virgules d'un type en accord avec le code format
correspondant.
Les principaux codes de conversion
c char : caractère affiché (convient aussi à short ou à int compte tenu des conversions systématiques)
d int (convient aussi à char ou à int, compte tenu des conversions systématiques)
u unsigned int (convient aussi à unsigned char ou à unsigned short, compte tenu des conversions
systématiques)
ld long
lu unsigned long
Langage C
12
f double ou float (compte tenu des conversions systématiques float -> double) écrit en notation
"décimale" avec six chiffres après le point (par exemple : 1.234500 ou 123.456789)
Action sur le gabarit d'affichage
Par défaut, les entiers sont affichés avec le nombre de caractères nécessaires (sans espaces avant ou après).
Les flottants sont affichés avec six chiffres après le point (aussi bien pour le code e que f).
Un nombre placé après % dans le code de format précise un gabarit d'affichage, c'est-à-dire un nombre
minimal de caractères à utiliser. Si le nombre peut s'écrire avec moins de caractères, printf le fera
précéder d'un nombre suffisant d'espaces ; en revanche, si le nombre ne peut s'afficher convenablement
dans le gabarit imparti, printf utilisera le nombre de caractères nécessaires.
Voici quelques exemples, dans lesquels nous fournissons, à la suite d'une instruction printf, à la fois des
valeurs possibles des expressions à afficher et le résultat obtenu à l'écran. Notez que le symbole ^
représente un espace.
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
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
Actions sur la précision
Pour les types flottants, on peut spécifier un nombre de chiffres (éventuellement inférieur à 6) après le
point décimal (aussi bien pour la notation décimale que pour la notation exponentielle). Ce nombre doit
apparaître, précédé d'un point, avant le code de format (et éventuellement après le gabarit). Voici
quelques exemples :
printf ("%10.3f", x) ;
• x = 1.2345
^^^^^1.235
• x = 1.2345E3
^^1234.500
Langage C
13
• x = 1.2345E7
12345000.000
En cas d'erreur de programmation
Deux types d'erreur de programmation peuvent apparaître dans l'emploi de printf.
1. Code de format en désaccord avec le type de l'expression
Lorsque le code de format, bien qu'erroné, correspond à une information de même taille (c'est-à-dire
occupant la même place en mémoire) que celle relative au type de l'expression, les conséquences de
l'erreur se limitent à une "mauvaise interprétation de l'expression". C'est ce qui se passe, par exemple,
lorsque l'on écrit une valeur de type int en %u ou une valeur de type unsigned int en %d.
En revanche, lorsque le code format correspond à une information de taille différente de celle relative au
type de l'expression, les conséquences sont généralement plus désastreuses, du moins si d'autres valeurs
doivent être affichées à la suite. En effet, tout se passe alors comme si, dans la "suite d'octets"
(correspondant aux différentes valeurs à afficher) reçue par printf, le "repérage" des emplacements des
valeurs suivantes se trouvait soumis à un "décalage".
2. Nombre de codes de format différent u nombre d'expressions de la liste
Dans ce cas, il faut savoir que C cherche toujours à satisfaire le contenu du format.
Ce qui signifie que, si des expressions de la liste n'ont pas de code format, elles ne seront pas affichées.
C'est le cas dans cette instruction où la valeur de p ne sera pas affichée : printf ("%d", n, p) ;
En revanche, si vous prévoyez trop de codes de format, les conséquences seront là encore assez
désastreuses puisque printf cherchera à afficher... n'importe quoi. C'est le cas dans cette instruction où
deux valeurs seront affichées, la seconde étant (relativement) aléatoire : printf ("%d %d ", n) ;
La macro putchar
L'expression :
putchar (c)
joue le même rôle que :
printf ("%c", c) ;
Les possibilités de la fonction scanf
La syntaxe de scanf
D'une manière générale, l'appel de scanf se présente ainsi :
scanf ( format, liste_d_adresses)
format :
-constante chaîne (entre " "),
-pointeur sur une "chaîne de caractères" (cette notion sera étudiée ultérieurement)
liste_d_adresses : liste de "lvalue", séparées par des virgules, d'un type en accord avec le code de format
correspondant.
Les principaux codes de conversion de scanf
Pour chaque code de conversion, nous précisons le type de la "lvalue" correspondante.
Langage C
14
c char
d int
u unsigned int
hd short int
hu unsigned short
ld long int
lu unsigned long
f ou e float écrit indifféremment dans l'une des deux notations : décimale 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 (notion qui sera étudiée ultérieurement)
Remarque :
Contrairement à ce qui se passait pour printf, il ne peut plus y avoir ici de conversion automatique
puisque l'argument transmis à scanf est l'adresse d'un emplacement mémoire. C'est ce qui justifie
l'existence d'un code hd par exemple pour le type short ou encore celle des codes lf et le pour le type
double.
Action sur le gabarit
Comme dans les codes de format de printf, on peut, dans un code de format de scanf, 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.
La macro getchar
L'expression : c = getchar() joue le même rôle que : scanf ("%c", &c) tout en étant plus rapide puisque ne
faisant pas appel au mécanisme d'analyse d'un format. Notez bien que getchar utilise le même tampon
(image d'une ligne) que scanf. En toute rigueur, getchar est une "macro" (comme putchar) dont les
instructions figurent dans stdio.h. Là encore, l'omission d'une instruction #include appropriée conduit à
une erreur à l'édition de liens.
Jeu 28 Nov - 8:07 par arsenepoutsi
» CCNA version 4 français
Dim 31 Mar - 15:15 par kadhouceeee
» Trés important " Livre exercices en langage C ( claude delannoy) "
Jeu 27 Sep - 16:31 par latifa oustouh
» Ulead VideoStudio 11.5.0157.2 Plus + Crack Collection
Jeu 26 Avr - 9:51 par miloduvi
» Langage IDL(Interface Definition Language)
Mar 27 Sep - 13:02 par Abdelkhalek Bakkari
» demande cours PHP
Jeu 2 Juin - 11:23 par elasriahmed
» exemple page web réaliser avec du html et JavaScript
Lun 30 Mai - 4:05 par ouh.rouchan.zakaria
» cours group2_ 2année 2011
Dim 20 Mar - 15:35 par El Maligno Angelo
» Cours : Infrastructures Réseaux 2003 Server
Mar 15 Fév - 6:55 par jettjackson
» cours officiel de CCNA 2
Mar 18 Jan - 13:53 par agares