Paramètres positionnels printf_p
Les paramètres positionnels permettent de spécifier le nombre des arguments, qui doivent être remplacés dans un champ sous la forme d'une chaine. Les fonctions suivantes de paramètres positionnelsprintf sont disponibles :
printf, _printf_l, wprintf, _wprintf_l
_printf_p, _printf_p_l, _wprintf_p, _wprintf_p_lsprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l
_sprintf_p, _sprintf_p_l, _swprintf_p, _swprintf_p_l_cprintf, _cprintf_l, _cwprintf, _cwprintf_l
_cprintf_p, _cprintf_p_l, _cwprintf_p, _cwprintf_p_lfprintf, _fprintf_l, fwprintf, _fwprintf_l
_fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_lvprintf, _vprintf_l, vwprintf, _vwprintf_l
_vprintf_p, _vprintf_p_l, _vwprintf_p, _vwprintf_p_lvfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l
_vfprintf_p, _vfprintf_p_l, _vfwprintf_p, _vfwprintf_p_lvsprintf, _vsprintf_l, vswprintf, _vswprintf_l, __vswprintf_l
_vsprintf_p, _vsprintf_p_l, _vswprintf_p, _vswprintf_p_l
Spécifier des paramètres positionnels
Indexation de paramètre
Par défaut les fonctions de position se comportent de la même manière que les autres, si aucune mise en forme positionnelle n'est présente. Les paramètres positionnels sont spécifiés à l'aide du format « %m$x », où m indique un nombre ordinal numérique indiquant la position du paramètre dans la liste des paramètres, précédant la chaîne de format et x indique le type de caractère de champ de type spécifié dans la fonction printf. Les paramètres de la liste sont indexés en partant de la valeur 1 pour le premier élément dans la liste et ainsi de suite. Pour des informations supplémentaires relatives au les caractères de champ de type, consultez Caractères du champ de type printf.
Pour obtenir un exemple de ce comportement, consultez .
_printf_p("%1$s %2$s", "November", "10");
s'imprime
November 10
L'ordre des valeurs utilisées n'a pas besoin de correspondre à celui des arguments fournis. La syntaxe suivante est valide :
_printf_p("%2$s %1$s", "November", "10");
s'imprime
10 November
L'option peut être utilisée plusieurs fois lors de la mise en forme, contrairement aux chaînes de format traditionnelles, afin que
_printf_p("%{1$d times %1$d is %2$d", 10, 100);
s'imprime
10 times 10 is 100
Toutefois, tous les arguments doivent être utilisés au moins une fois quelque part dans la chaîne de format.
Le nombre maximal de paramètres positionnels autorisés dans une chaîne de format est donné par _ARGMAX.
Largeur et prédiction
Lorsque le symbole * est utilisé pour spécifier que la largeur ou la précision doit être déterminée à partir d'un argument, la position de la largeur ou la valeur de la prédiction doit apparaître juste après le symbole *. Par exemple :
_printf_p("%1$*2$s","Hello", 10);
ou
_printf_p("%2$*1$s",10, "Hello");
Combinaison de position et d'arguments non positionnels.
Les paramètres positionnels ne peuvent être combinés avec des paramètres non positionnels dans la même chaîne de format. Toutefois, printf_s et les fonctions connexes prennent toujours en charge les paramètres non positionnels dans les chaînes de format qui ne contiennent aucun paramètre positionnel.
Exemple
// 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 argc, char *argv[])
{
int i = 1,
j = 2,
k = 3;
double x = 0.1,
y = 0.2,
z = 0.3;
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 args are numbers indicating the
// argument enclosed in curly braces.
_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);
_printf_p("%1$s %2$s %3$s\n", s1, s2, s3);
_printf_p("%3$s %1$s %2$s\n", s1, s2, s3);
}
Voir aussi
Référence
Caractères du champ de type printf