int sprintf(char *destination, const char *format, ... )
Cette fonction effectue les mêmes mises en forme que printf, avec la différence que les caractères produits ne sont pas ajoutés à un flot, mais sont concaténés ensemble dans la chaîne destination. Elle permet donc de dissocier les deux fonctionnalités de printf, transcodage et écriture des données, afin d’utiliser la première sans la deuxième.
La fonction d’écriture sur l’unité de sortie standard (en principe l’écran du poste de travail) avec conversion et mise en forme des données est :
printf( format , expr1 , expr2 , ... exprn )
format est une chaîne qui joue un rôle particulier. Elle est formée de caractères qui seront écrits normalement, mélangés à des indications sur les types des expressions expr1, expr2, ... exprn et sur l’aspect sous lequel il faut écrire les valeurs de ces expressions.
Cela fonctionne de la manière suivante : la fonction printf parcourt la chaîne format et reconnaît certains groupes de caractères comme étant des spécifications de format. C’est le caractère % qui déclenche cette reconnaissance.
La fonction printf recopie sur le flot de sortie tout caractère qui ne fait pas partie d’une telle
spécification. La ieme spécification détermine la manière dont la valeur de expri sera écrite. Les spécifications de format reconnues par la fonction printf sont expliquées dans la table. Notez que seuls les éléments 1 (le caractère %) et 6 (la lettre qui indique le type de la conversion) sont obligatoires dans une spécification de format.
Exemple 1. Supposons qu’on ait donné la déclaration-initialisation float x = 123.456;
Voici une liste d’appels de printf, avec l’affichage produit par chacun :
Appel Affichage obtenu
printf(">%f<", x); >123.456001<
printf(">%12f<", x); > 123.456001<
printf(">%12.2f<", x); > 123.46<
printf(">%.2f<", x); >123.46<
printf(">%-12.2f<", x); >123.46 <
printf(">%+-12.2f<", x); >+123.46 <
printf(">% -12.2f<", x); > 123.46 <
printf(">%12.2f<", x); > 123.46<
printf(">%012.2f<", x); >000000123.46<
printf(">%.0f<", x); >123<
printf(">%#.0f<", x); >123.<
Chaque spécification de format se compose, dans l’ordre indiqué, des éléments suivants :
1. Obligatoirement, le caractère %.
2. Facultativement, un ou plusieurs modifieurs, dans un ordre quelconque, parmi :
- : cadrer à gauche du champ (par défaut le cadrage se fait à droite) ;
+ : imprimer le signe du nombre même lorsque celui-ci est positif ;
espace : si le premier caractère n’est pas un signe, placer un espace au début d’un nombre ;
0 : compléter les nombres par des zéros (à la place de blancs) ;
# : utiliser le format alternatif, lorsqu’il existe (voir ci-dessous).
3. Facultativement, un nombre qui indique la largeur du champ. Il s’agit d’une largeur minimum, automatiquement augmentée si elle se révèle insuffisante.
4. Facultativement, un point suivi d’un nombre qui indique la précision :
– dans les conversions e, E ou f : le nombre de chiffres à écrire après la virgule décimale ;
– dans les conversions g ou G : le nombre de chiffres significatifs ;
– pour une chaîne : le nombre maximum de caractères à afficher ;
– pour un entier (conversions d et u) : le nombre minimum de chiffres. Le cas échéant, des zéros seront ajoutés à gauche.
5. Facultativement, une lettre qui complète l’information sur la nature de l’argument et, le cas échéant, modifie en conséquence la largeur du champ :
h (associée à d ou u) : l’argument est un short. Cette indication est sans effet si un int et un short sont la même chose ;
l (associée à d, u, x ou X) : l’argument est un long ou un unsigned long. Cette indication est sans effet si un int et un long sont la même chose ;
L (associée à f, e, E, g ou G) : l’argument est un long double.
6. Obligatoirement, un caractère de conversion, parmi
d : argument : int ; impression : notation décimale signée.
o : argument : int ; impression : notation octale non signée.
Format alternatif (voir # au point 2) : un 0 est imprimé au début du nombre.
x : argument : int ; impression : notation hexadécimale non signée avec les chiffres 0...9abcdef.
Format alternatif : le nombre est précédé de 0x.
X : comme x mais avec ABCDEF et 0X à la place de abcdef et 0x.
u : argument : int ; impression : notation décimale non signée.
c : argument : unsigned char ; impression : un seul caractère.
s : argument : char * ; impression : chaîne de caractères.
f : argument : double ; impression : notation en _ virgule fixe _ [-]zzz.fff. Le nombre de f est donné par la précision. Précision par défaut : 6. Si la précision vaut zéro, le point est supprimé.
Format alternatif : le point est toujours imprimé.
e : argument : double. Impression : notation en _ virgule flottante _ [-]z.ffffff e§nn. Le nombre de f est donné par la précision. Précision par défaut : 6. Si la précision vaut zéro, le point est supprimé.
Format alternatif : le point est toujours imprimé.
E : comme %e avec E à la place de e.
g : argument : double ; impression : comme %e si l’exposant est inférieur à -4 ou supérieur à la précision, comme %f sinon.
Format alternatif : le point est toujours imprimé.
G : comme %g avec E à la place de e.
p : argument : void * ; impression : dépend de l’implantation (par exemple %X).
n : argument : int *. Aucune impression. Effet : l’argument correspondant doit être l’adresse d’une variable entière, qui recevra pour valeur le nombre de caractères effectivement écrits jusqu’à présent par l’appel en cours de la fonction printf.
% : pas d’argument correspondant ; impression : le caractère %.
Avec les déclarations suivantes : char text[32]; et unsigned char c;
L’instruction : sprintf(text,"\n%04x",c++) correspond donc à une conversion du nombre entier non signé " c " en une chaîne de caractères placée au début du vecteur " text " (d’au moins 4 caractères complété par des 0 si nécessaire). Cette chaîne de caractères représente la valeur de " c " en hexadécimal. Le " \n " avant le symbole " % " indique un passage à la ligne (retour chariot).
Issu du polycopié de H.Garreta " PROGRAMMATION EN C" Fonction sprintf.