Un meilleur job mieux payé ?

Deviens chef de projet, développeur, ingénieur, informaticien

Mets à jour ton profil pro

ça m'intéresse

Developpez.com - C
X

Choisissez d'abord la catégorieensuite la rubrique :


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 printf) 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.

info 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.

warning 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.

info Disponible uniquement en C99.

III-D-5. j

Le paramètre est de type intmax_t ou uintmax_t.

info Disponible uniquement en C99.

III-D-6. z

Le paramètre est de type size_t.

info Disponible uniquement en C99.

III-D-7. t

Le paramètre est de type ptrdiff_t.

info 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.

Valid XHTML 1.1!Valid CSS!

Copyright © 2006 gege2061. Aucune reproduction, même partielle, ne peut être faite de ce site et 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.

Contacter le responsable de la rubrique C