Les séquences d'échappement

Les séquences d'échappement se composent des éléments suivants :
$1$
le caractère * (optionnel) qui indique que la directive doit être considérée comme un pur modèle : pas de conversion de la chaîne lue, et pas d'affectation à un param$_i$.

$2$
un nombre (optionnel) qui indique la longueur maximum de la chaîne acceptable du flot d'entrée.

$3$
un caractère optionnel, qui est un modificateur de type, pouvant prendre l'une des valeurs suivantes :

h
s'appliquant aux formats d, i, n : param$_i$ sera interprété comme un pointeur vers un short int.

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

l
s'appliquant aux formats d, i, n : param$_i$ sera interprété comme un pointeur vers un long int.

l
s'appliquant aux formats o, u, x : param$_i$ sera interprété comme un pointeur vers un unsigned long int.

l
s'appliquant aux formats e, f, g : param$_i$ sera interprété comme un pointeur vers un double.

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

$4$
un caractère de conversion qui peut prendre l'une des valeurs suivantes :

d
modèle pour un nombre décimal éventuellement précédé d'un signe. Le param$_i$ correspondant est interprété comme un pointeur vers un int, sauf si la directive contient un modificateur de type.

i
modèle pour un nombre éventuellement précédé d'un signe, et ayant l'une des trois formes suivantes :

-
un nombre décimal.
-
un nombre débutant par 0 qui sera pris comme nombre octal.
-
un nombre débutant par 0x ou 0X, qui sera pris comme nombre hexadécimal.

Le param$_i$ correspondant est interprété comme un pointeur vers un int, sauf si la directive contient un modificateur de type.

o
modèle pour un nombre octal éventuellement précédé d'un signe. Le param$_i$ correspondant est interprété comme un pointeur vers un unsigned int, sauf si la directive contient un modificateur de type.

u
modèle pour un nombre décimal éventuellement précédé d'un signe.5.4Le param$_i$ correspondant est interprété comme un pointeur vers un unsigned int, sauf si la directive contient un modificateur de type.

x
modèle pour un nombre hexadécimal éventuellement précédé d'un signe. Le param$_i$ correspondant est interprété comme un pointeur vers un unsigned int, sauf si la directive contient un modificateur de type.

Remarque
En ce qui concerne les formats o, u, et x, le lecteur a sans doute été surpris de voir que le param$_i$ correspondant est interprété comme un pointeur vers un unsigned int alors que la chaîne dans le flot d'entrée qui correspond à ces formats est un nombre éventuellement précédé d'un signe. Il n'y a pas d'erreur, c'est bien ce que dit la norme.

c
modèle pour une suite de caractères dont le nombre est donné par le nombre (optionnel) qui indique la longueur maximum de la chaîne acceptable du flot d'entrée (Cf plus haut). Si ce nombre optionnel ne figure pas dans la directive, il est pris égal à 1. Le param$_i$ correspondant est interprété comme étant un pointeur vers un tableau de caractères suffisamment grand pour contenir la chaîne lue. Il n'y a pas de null rajouté à la fin de la chaîne lue dans le flot d'entrée.

s
modèle pour une suite de caractères non blancs. Le param$_i$ correspondant est interprété comme un pointeur vers un tableau de caractères suffisamment grand pour contenir la chaîne lue plus un null terminal.

e,f,g
modèle pour un flottant écrit selon la syntaxe d'une constante flottante du langage C. Le param$_i$ correspondant est interprété comme un pointeur vers un float , sauf si la directive contient un modificateur de type.

[
Dans la chaîne format, ce caractère introduit une séquence particulière destinée à définir un scanset. La séquence est formée du caractère [, suivi d'une suite de caractères quelconques, suivi du caractère ]. Si le premier caractère après le crochet ouvrant n'est pas le caractère ^, le scanset est l'ensemble des caractères entre crochets. Si le caractère après le crochet ouvrant est le caractère ^, le scanset est l'ensemble des caractères ne se trouvant pas dans la chaîne entre crochets. Le scanset peut comprendre le caractère ] à condition de le mettre en début soit [] ...] ou [^]...] selon que l'on utilise la forme sans ou avec ^. Le scanset peut contenir ^ à condition de ne pas le mettre en tête : [...^...].

Une directive [ est un modèle pour une suite de caractères appartenant au scanset. Le param$_i$ correspondant est interprété comme un pointeur vers un tableau de caractères suffisamment grand pour contenir la chaîne lue plus un null terminal.

p
modèle pour un pointeur écrit d'une manière dépendant de l'implémentation, mais identique à l'impression par printf d'un pointeur selon le format %p. Le param$_i$ correspondant est interprété comme un pointeur vers un pointeur vers void.

n
cette directive n'est pas un modèle. Elle ne sert qu'à mettre une valeur dans l'objet pointé par le param$_i$ correspondant. Le param$_i$ correspondant est interprété comme un pointeur vers un int dans lequel fscanf écrit le nombre de caractères lus jusqu'à ce moment, dans le flot de données, par cette invocation de fscanf. L'exécution d'une directive %n n'augmente pas le nombre des param$_i$ affectés qui sera retourné par fscanf (Cf [*]).

%
est un modèle pour le caractère %. La directive complète est %%.

Matthieu Moy 2017-02-08