printf_p
paramètres positionnels
Les paramètres positionnels vous permettent de spécifier par nombre l’argument à remplacer dans un champ dans une chaîne de format. Voici les fonctions printf
avec paramètres positionnels disponibles :
Comment spécifier des paramètres positionnels
Indexation des paramètres
Par défaut, en l’absence de mise en forme positionnelle, les fonctions positionnelles se comportent comme les fonctions non positionnelles. Vous spécifiez le paramètre positionnel à mettre en forme à l’aide de %n$
au début du spécificateur de format, où n
correspond à la position du paramètre à mettre en forme dans la liste de paramètres. La position de paramètre commence à 1 pour le premier argument suivant la chaîne de format. Le reste du spécificateur de format suit les mêmes règles que le spécificateur de format printf
. Pour plus d’informations sur les spécificateurs de format, consultez la syntaxe de spécification de format : printf
et wprintf
les fonctions.
Voici un exemple de mise en forme positionnelle :
_printf_p("%1$s %2$s", "November", "10");
Cet exemple imprime :
November 10
L’ordre des nombres utilisés ne doit pas nécessairement corresponde à l’ordre des arguments. Par exemple, voici une chaîne de format valide :
_printf_p("%2$s %1$s", "November", "10");
Cet exemple imprime :
10 November
Contrairement aux chaînes de format classiques, vous pouvez utiliser des paramètres positionnels plusieurs fois dans une chaîne de format. Par exemple,
_printf_p("%1$d times %1$d is %2$d", 10, 100);
Cet exemple imprime :
10 times 10 is 100
Tous les arguments doivent être utilisés au moins une fois dans la chaîne de format. Le nombre maximal de paramètres positionnels autorisés dans une chaîne de format est fourni par _ARGMAX
.
Largeur et précision
Vous pouvez utiliser *n$
pour spécifier un paramètre positionnel comme spécificateur de largeur ou de précision, où n
est la position du paramètre de largeur ou de précision dans la liste de paramètres. La position de la largeur ou de la valeur de précision doit apparaître immédiatement après le symbole *. Par exemple,
_printf_p("%1$*2$s","Hello", 10);
or
_printf_p("%2$*1$s", 10, "Hello");
Mélange d’arguments positionnels et non-positionnels
Les paramètres positionnels ne doivent pas être mélangés avec des paramètres non positionnels dans la même chaîne de format. Si aucune mise en forme positionnelle n’est utilisée, tous les spécificateurs de format doivent utiliser la mise en forme positionnelle. Toutefois, printf_p
et les fonctions connexes prennent toujours en charge les paramètres non positionnels dans les chaînes de format qui contiennent des paramètres positionnels.
Exemple
// positional_args.c
// Build by using: cl /W4 positional_args.c
// Positional arguments allow the specification of the order
// in which arguments are consumed in a formatting string.
#include <stdio.h>
int main()
{
int i = 1,
j = 2,
k = 3;
double x = 0.1,
y = 2.22,
z = 333.3333;
char *s1 = "abc",
*s2 = "def",
*s3 = "ghi";
// If positional arguments are unspecified,
// normal input order is used.
_printf_p("%d %d %d\n", i, j, k);
// Positional arguments are numbers followed by a $ character.
_printf_p("%3$d %1$d %2$d\n", i, j, k);
// The same positional argument may be reused.
_printf_p("%1$d %2$d %1$d\n", i, j);
// The positional arguments may appear in any order.
_printf_p("%1$s %2$s %3$s\n", s1, s2, s3);
_printf_p("%3$s %1$s %2$s\n", s1, s2, s3);
// Precision and width specifiers must be int types.
_printf_p("%3$*5$f %2$.*4$f %1$*4$.*5$f\n", x, y, z, j, k);
}
1 2 3
3 1 2
1 2 1
abc def ghi
ghi abc def
333.333300 2.22 0.100
Voir aussi
Syntaxe de spécification de format : printf
et wprintf
fonctions