Les séquences d'échappement

Une séquence d'échappement se compose des éléments suivants :

$1$
Un certain nombre (éventuellement zéro) d'indicateurs pouvant être les caractères suivants :

-
param$_i$ sera cadré à gauche dans son champ d'impression.

+
si param$_i$ est un nombre signé, il sera imprimé précédé du signe + ou -.

blanc
si param$_i$ est un nombre signé et si son premier caractère n'est pas un signe, on imprimera un blanc devant param$_i$. Si on a à la fois l'indicateur + et l'indicateur blanc, ce dernier sera ignoré.

#
cet indicateur demande l'impression de param$_i$ sous une forme non standard. Pour le format o, cet indicateur force la précision à être augmentée de manière à ce que param$_i$ soit imprimé en commençant par un zéro. Pour les formats x et X, cet indicateur a pour but de faire précéder param$_i$ respectivement de 0x ou 0X, sauf si param$_i$ est nul. Pour les formats e, E, f, g et G, cet indicateur force param$_i$ à être imprimé avec un point décimal, même si il n'y a aucun chiffre après. Pour les formats g et G, cet indicateur empêche les zéros de la fin d'être enlevés. Pour les autres formats, le comportement n'est pas défini.

0
pour les formats d, i, o, u, x, X, e, E, f, g, et G cet indicateur a pour effet de compléter l'écriture de param$_i$ avec des 0 en tête, de manière à ce qu'il remplisse tout son champ d'impression. Si il y a à la fois les deux indicateurs 0 et -, l'indicateur 0 sera ignoré. Pour les formats d, i, o, u, x et X, si il y a une indication de précision, l'indicateur 0 est ignoré. Pour les autres formats, le comportement n'est pas défini.

$2$
Un nombre entier décimal (optionnel) indiquant la taille minimum du champ d'impression, exprimée en caractères. Si param$_i$ s'écrit sur un nombre de caractères inférieur à cette taille, param$_i$ est complété à droite ou à gauche (selon que l'on aura utilisé ou pas l'indicateur -), avec des blancs ou des 0, comme il a été expliqué plus haut.

$3$
Une indication (optionnelle) de précision, qui donne :

-
le nombre minimum de chiffres pour les formats d, i, o, u, x et X.

-
le nombre de chiffres après le point décimal pour les formats e, E et f.

-
le nombre maximum de chiffres significatifs pour les formats g et G

-
le nombre maximum de caractères pour le format s.

Cette indication de précision prend la forme d'un point (.) suivi d'un nombre décimal optionnel. Si ce nombre est omis, la précision est prise égale à 0.

Remarque
Le nombre entier décimal indiquant la taille maximum du champ d'impression et/ou le nombre entier décimal indiquant la précision, peuvent être remplacées par le caractère *. Si le caractère * a été utilisé une seule fois dans le format, la valeur correspondante (taille du champ ou précision) sera prise égale à param$_{i-1}$. Si le caractère * a été utilisé deux fois, la taille du champ d'impression sera égale à param$_{i-2}$, et la précision sera égale à param$_{i-1}$. Si la taille maximum du champ d'impression a une valeur négative, cela a la sémantique de l'indicateur - suivi de la valeur (positive) de la taille du champ d'impression. Si la précision est négative, cela a la sémantique d'une précision absente.

$4$
un caractère optionnel, qui peut être :

h
s'appliquant aux formats d, i, o, u, x ou X : param$_i$ sera interprété comme un short int ou unsigned short int.

h
s'appliquant au format n : param$_i$ sera interprété comme un pointeur vers un short int.

l
5.2. s'appliquant aux formats d, i, o, u, x ou X : param$_i$ sera interprété comme un long int ou un unsigned long int.

l
5.3 s'appliquant au format n : param$_i$ sera interprété comme un pointeur vers un long int.

L
s'appliquant aux formats e, E, f, g ou G : param$_i$ sera interprété comme un long double.

Si un h, l ou L s'applique à un autre format que ceux indiqués ci-dessus, le comportement est indéterminé.

$5$
un caractère qui peut prendre les valeurs suivantes :

d, i
param$_i$ sera interprété comme un int, et écrit sous forme décimale signée.

u
param$_i$ sera interprété comme un unsigned int, et écrit sous forme décimale non signée.

o
param$_i$ sera interprété comme un int, et écrit sous forme octale non signée.

x, X
param$_i$ sera interprété comme un int, et écrit sous forme hexadécimale non signée. La notation hexadécimale utilisera les lettres abcdef dans le cas du format x, et les lettres ABCDEF dans le cas du format X.

Dans les cas qui précèdent, la précision indique le nombre minimum de chiffres avec lesquels écrire param$_i$. Si param$_i$ s'écrit avec moins de chiffres, il sera complété avec des zéros. La précision par défaut est 1. Une valeur nulle demandée avec une précision nulle, ne sera pas imprimée.

c
param$_i$ sera interprété comme un unsigned char.

s
param$_i$ sera interprété comme l'adresse d'un tableau de caractères (terminé ou non par un null). Les caractères du tableau seront imprimés jusqu'au premier des deux évènements possibles :
-
impression de précision caractères de param$_i$.
-
rencontre de null dans param$_i$.
Dans le cas où param$_i$ n'est pas terminé par un null, le format d'impression doit comporter une indication de précision.

p
param$_i$ sera interprété comme un pointeur vers void. Le pointeur sera imprimé sous une forme dépendante de l'implémentation.

n
param$_i$ sera interprété comme un pointeur vers un int auquel sera affecté le nombre de caractères écrits jusqu'alors par cette invocation de fprintf.

e,E
param$_i$ sera interprété comme un double et écrit sous la forme :
-$_{option}$ pe . pf e signe exposant
dans laquelle pe et pf sont respectivement partie entière et partie fractionnaire de la mantisse. La partie entière est exprimée avec un seul chiffre, la partie fractionnaire est exprimée avec un nombre de chiffres égal à la précision. La précision est prise égale à 6 par défaut. Si la précision est 0, le point décimal n'apparaît pas. L'exposant contient toujours au moins deux chiffres. Si param$_i$ est nul, l'exposant sera nul. Dans le cas du format E, la lettre E est imprimée à la place de e.

f
param$_i$ sera interprété comme un double et écrit sous la forme :
-$_{option}$ pe . pf
dans laquelle pe et pf sont respectivement partie entière et partie fractionnaire de la mantisse. La partie fractionnaire est exprimée avec un nombre de chiffres égal à la précision. La précision est prise égale à 6 par défaut. Si la précision est 0, le point décimal n'apparaît pas.

g,G
param$_i$ sera interprété comme un double et écrit sous le format f, ou le format e, selon sa valeur. Si param$_i$ a un exposant inférieur à -4 ou plus grand ou égal à la précision, il sera imprimé sous le format e, sinon il sera imprimé sous le format f. D'éventuels zéros à la fin de la partie fractionnaire sont enlevés. Le point décimal n'apparaît que si il est suivi d'au moins un chiffre. Dans ce qui précède, l'utilisation du format G implique l'utilisation du format E à la place du format e.

%
Un caractère % est écrit.

Matthieu Moy 2017-02-08