Les descripteurs de format
Par
gege2061 (home) (Blog)
Ce tutorial décrit les spécificateurs de format utilisés par la fonction
printf(1).
I. Introduction
II. Petit rappel sur l'utilisation de printf
III. Les spécificateurs de format
III-A. Spécificateurs
III-A-1. d, i
III-A-2. o, u, x, X
III-A-3. e, E
III-A-4. f, F
III-A-5. g, G
III-A-6. a, A
III-A-7. c
III-A-8. s
III-A-9. p
III-A-10. n
III-A-11. %
III-B. Gabarit
III-C. Précision
III-D. Modificateurs de longueur
III-D-1. hh
III-D-2. h
III-D-3. l
III-D-4. ll
III-D-5. j
III-D-6. z
III-D-7. t
III-D-8. L
III-E. Drapeaux
III-E-1. #
III-E-2. 0
III-E-3. -
III-E-4. ' ' (espace)
III-E-5. +
III-F. Récapitulatif
I. Introduction
La fonction
printf est l'une des premières fonctions abordées lors d'une initiation au langage C, or c'est sûrement l'une des plus difficile à maîtriser et des plus puissantes de la bibliothèque standard. A quoi cela est dû ? A son premier argument qui est une chaîne de caractères, qui à pour but de préciser le formatage de sortie (d'où le f de print
f) et qui peut contenir des spécificateurs de conversions.
II. Petit rappel sur l'utilisation de printf
printf est une fonction à nombre variable d'argument dont voici le prototype :
#include <stdio.h>
int printf (const char *format, ...); |
Elle permet d'afficher une chaîne de caractère sur la sortie standard.
La particularité de cette fonction réside dans la possibilité de construire la chaîne de caractères en utilisant des variables de différents types.
III. Les spécificateurs de format
Les spécificateurs permettent d'insérer le contenu des variables dans une chaîne de caractères (qui sera ensuite affichée par la fonction printf). Voici la forme générale des ces spécificateurs :
%[drapeaux][gabarit][.précision][modificateur]spécificateur |
III-A. Spécificateurs
L'indicateur de conversion est le seul paramètre obligatoire, il permet à la fonction printf de connaître le type de la variable à inclure.
III-A-1. d, i
Converti un argument de type int en nombre décimal signé.
III-A-2. o, u, x, X
L'argument de type unsigned int est converti en nombre octal non-signé (o), décimal non-signé (u), ou hexadécimal non-signé (x et X). Dans ce dernier cas, l'option x utilise les lettres abcdef alors que X utilise les lettres ABCDEF.
III-A-3. e, E
L'argument de type double est affiché avec la notation scientifique.
III-A-4. f, F
Affiche une variable de type
double avec une précision par défaut de 6 chiffres après la virgule (voir le paragraphe
III-C Précision pour plus de détail).
III-A-5. g, G
L'argument de type
double est converti en
style e si l'exposant est inférieur à -4 ou supérieur à la précision demandée (6 par défaut). Sinon c'est le
style f qui est utilisé.
III-A-6. a, A
Ce format est identique au
style g en utilisation le format hexadécimal.
 |
Disponible uniquement en C99.
|
III-A-7. c
Converti l'argument de type int en unsigned int puis affiche le caractère correspondant.
III-A-8. s
L'argument de type
const char * est considéré comme une chaîne de caractère au sens du langage C (voir
Les chaînes de caractères en C pour plus de détails).
La chaîne de caractère est affichée jusqu'au caractère de fin sauf si la précision est indiquée.
III-A-9. p
Permet d'afficher l'adresse contenue dans un pointeur de type void * sous forme hexadécimale.
III-A-10. n
Contrairement au argument vu précédemment, celui-ci ne permet pas d'afficher un type de variable mais sert à récupérer, dans un paramètre de type int *, le nombre de caractères déjà écrits.
 |
Ce paramètre est à l'origine de faille de sécurité dans les programme écrit en C : Les pièges du C.
|
III-A-11. %
Affiche le caractère '%', aucun argument n'est utilisé.
III-B. Gabarit
Ce paramètre optionnel est un nombre non négatif (ou le caractère *, voir le paragraphe suivant), ne commençant pas par zéro, qui permet de préciser la largeur minimale du champ. Si la largeur précisée est plus grande que la valeur convertie, elle sera complétée, par défaut, par des espaces à gauche. Par contre la valeur ne sera pas tronquée si la précision demandée est plus petite.
III-C. Précision
Pour les conversions d, i, o, u, x ou X la précision donne le nombre minimum de chiffres (complété par des zéro). Pour a, A, e, E, f et F il s'agit du nombre de chiffres à afficher après la virgule. Pour g et G, il s'agit du nombre maximum de chiffres significatifs ou du nombres maximum de bytes à écrire pour les paramètres de types s.
Il est aussi possible de spécifier la précision ou la largeur d'un champs en argument en utilisant le caractère * à la place d'un nombre :
#include <stdio.h>
int main (void)
{
int i = 10;
for (i = 0; i < 10; i++)
{
printf ("|%.*f|\n", i, 10.0);
}
return 0;
} |
$ ./a.out
|10|
|10.0|
|10.00|
|10.000|
|10.0000|
|10.00000|
|10.000000|
|10.0000000|
|10.00000000|
|10.000000000| |
Si l'argument donné pour la largeur du champs est un nombre négatif, le drapeau '-' est activé suivie de la valeur positive. Si la précision est négative, elle est ignorée.
III-D. Modificateurs de longueur
Les modificateurs de longueurs viennent complété le spécificateurs de format.
III-D-1. hh
Le paramètre est de type signed char ou unsigned char.
III-D-2. h
Le paramètre est de type short int ou unsigned short int.
III-D-3. l
Le paramètre est de type long int ou unsigned long int.
En C99, ce modificateur s'applique aussi au caractère et au chaîne de caractères pour préciser qu'il s'agit de la version étendue (wint_t et wchar_t).
III-D-4. ll
Le paramètre est de type long long int ou unsigned long long int.
 |
Disponible uniquement en C99.
|
III-D-5. j
Le paramètre est de type intmax_t ou uintmax_t.
 |
Disponible uniquement en C99.
|
III-D-6. z
Le paramètre est de type size_t.
 |
Disponible uniquement en C99.
|
III-D-7. t
Le paramètre est de type ptrdiff_t.
 |
Disponible uniquement en C99.
|
III-D-8. L
Le paramètre est de type long double.
III-E. Drapeaux
III-E-1. #
Avec les spécificateurs a, A, e, E, g ou G le séparateur de la partie décimale est le point.
Avec les spécificateurs x ou X, le préfixe 0x ou 0X est ajouté.
Enfin avec le spécificateur o, le préfixe ajouté est 0.
III-E-2. 0
Des zéro sont affichés devant le nombres afin d'atteindre la gabarit demandé.
III-E-3. -
Le résultat de la conversion est aligné à gauche.
III-E-4. ' ' (espace)
Une espace sera placée devant les nombres positifs.
III-E-5. +
Le signe plus '+' sera affiché devant les nombres positifs.
III-F. Récapitulatif
Comme on cherche plus souvent le spécificateur à utiliser en fonction du type de variable, voici quelque exemple :
Type |
Spécificateur |
int |
d ou i |
unsigned int |
u, o, x, ou X |
double, float |
f, F, e, E, a, A, g ou G |
char |
c |
char * (terminé par un caractère nul '\0') |
s |
short int |
hd |
long int |
ld |
long long int |
lld |
long double |
Lf |
void * |
p |
intmax_t |
jc |
wint_t |
lc |
wchar_t * |
ls |
size_t |
zd |
ptrdiff_t |
td |
(1) | Dans ce tutorial je ne parle que de printf mais ceci s'applique aussi aux fonctions de la même famille tel que fprintf, sprintf, etc. |


Copyright © 2006 gege2061.
Aucune reproduction, même partielle, ne peut être faite
de ce site ni de l'ensemble de son contenu : textes, documents, images, etc.
sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à
trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.