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 :

Fonctions printf non-positionnelles Équivalents de paramètres positionnels
printf, _printf_l, wprintf, _wprintf_l _printf_p, _printf_p_l, _wprintf_p, _wprintf_p_l
sprintf, _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_l
fprintf, _fprintf_l, fwprintf, _fwprintf_l _fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_l
vprintf, _vprintf_l, vwprintf, _vwprintf_l _vprintf_p, _vprintf_p_l, _vwprintf_p, _vwprintf_p_l
vfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l _vfprintf_p, _vfprintf_p_l, _vfwprintf_p, _vfwprintf_p_l
vsprintf, _vsprintf_l, vswprintf, _vswprintf_l, __vswprintf_l _vsprintf_p, _vsprintf_p_l, _vswprintf_p, _vswprintf_p_l

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