Paramètres positionnels printf_pprintf_p Positional Parameters

Les paramètres positionnels permettent de spécifier à l’aide d’un nombre l’argument à remplacer dans un champ de chaîne de format.Positional parameters provide the ability to specify by number which of the arguments is to be substituted into a field in a format string. Voici les fonctions printf avec paramètres positionnels disponibles :The following positional parameter printf functions are available:

Fonctions printf non-positionnellesNon-positional printf functions Équivalents de paramètres positionnelsPositional parameter equivalents
printf, _printf_l, wprintf, _wprintf_lprintf, _printf_l, wprintf, _wprintf_l _printf_p, _printf_p_l, _wprintf_p, _wprintf_p_l_printf_p, _printf_p_l, _wprintf_p, _wprintf_p_l
sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_lsprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l _sprintf_p, _sprintf_p_l, _swprintf_p, _swprintf_p_l_sprintf_p, _sprintf_p_l, _swprintf_p, _swprintf_p_l
_cprintf, _cprintf_l, _cwprintf, _cwprintf_l_cprintf, _cprintf_l, _cwprintf, _cwprintf_l _cprintf_p, _cprintf_p_l, _cwprintf_p, _cwprintf_p_l_cprintf_p, _cprintf_p_l, _cwprintf_p, _cwprintf_p_l
fprintf, _fprintf_l, fwprintf, _fwprintf_lfprintf, _fprintf_l, fwprintf, _fwprintf_l _fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_l_fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_l
vprintf, _vprintf_l, vwprintf, _vwprintf_lvprintf, _vprintf_l, vwprintf, _vwprintf_l _vprintf_p, _vprintf_p_l, _vwprintf_p, _vwprintf_p_l_vprintf_p, _vprintf_p_l, _vwprintf_p, _vwprintf_p_l
vfprintf, _vfprintf_l, vfwprintf, _vfwprintf_lvfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l _vfprintf_p, _vfprintf_p_l, _vfwprintf_p, _vfwprintf_p_l_vfprintf_p, _vfprintf_p_l, _vfwprintf_p, _vfwprintf_p_l
vsprintf, _vsprintf_l, vswprintf, _vswprintf_l, __vswprintf_lvsprintf, _vsprintf_l, vswprintf, _vswprintf_l, __vswprintf_l _vsprintf_p, _vsprintf_p_l, _vswprintf_p, _vswprintf_p_l_vsprintf_p, _vsprintf_p_l, _vswprintf_p, _vswprintf_p_l

Comment spécifier des paramètres positionnelsHow to specify positional parameters

Indexation des paramètresParameter indexing

Par défaut, en l’absence de mise en forme positionnelle, les fonctions positionnelles se comportent comme les fonctions non positionnelles.By default, if no positional formatting is present, the positional functions behave identically to the non-positional ones. 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.You specify the positional parameter to format by using %n$ at the beginning of the format specifier, where n is the position of the parameter to format in the parameter list. La position de paramètre commence à 1 pour le premier argument suivant la chaîne de format.The parameter position starts at 1 for the first argument after the format string. Le reste du spécificateur de format suit les mêmes règles que le spécificateur de format printf.The remainder of the format specifier follows the same rules as the printf format specifier. Pour plus d’informations sur les spécificateurs de format, consultez Syntaxe de spécification de format : fonctions printf et wprintf.For more information about format specfiers, see Format Specification Syntax: printf and wprintf Functions.

Voici un exemple de mise en forme positionnelle :Here's an example of positional formatting:

_printf_p("%1$s %2$s", "November", "10");

Cela imprime :This prints:

November 10

L’ordre des nombres utilisés ne doit pas nécessairement corresponde à l’ordre des arguments.The order of the numbers used doesn't need to match the order of the arguments. Par exemple, voici une chaîne de format valide :For example, this is a valid format string:

_printf_p("%2$s %1$s", "November", "10");

Cela imprime :This prints:

10 November

Contrairement aux chaînes de format classiques, vous pouvez utiliser des paramètres positionnels plusieurs fois dans une chaîne de format.Unlike traditional format strings, positional parameters may be used more than once in a format string. Par exemple,For example,

_printf_p("%1$d times %1$d is %2$d", 10, 100);

Cela imprime :This prints:

10 times 10 is 100

Tous les arguments doivent être utilisés au moins une fois dans la chaîne de format.All arguments must be used at least once somewhere in the format string. Le nombre maximal de paramètres positionnels autorisés dans une chaîne de format est fourni par _ARGMAX.The maximum number of positional parameters allowed in a format string is given by _ARGMAX.

Largeur et précisionWidth and precision

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.You can use *n$ to specify a positional parameter as a width or precision specifier, where n is the position of the width or precision parameter in the parameter list. La position de la valeur de largeur ou de précision doit apparaître immédiatement après le symbole *.The position of the width or precision value must appear immediately following the * symbol. Par exemple,For example,

_printf_p("%1$*2$s","Hello", 10);

ou Gestionnaire de configurationor

_printf_p("%2$*1$s", 10, "Hello");

Mélange d’arguments positionnels et non-positionnelsMixing positional and non-positional arguments

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.Positional parameters may not be mixed with non-positional parameters in the same format string. Si aucune mise en forme positionnelle n’est utilisée, tous les spécificateurs de format doivent utiliser la mise en forme positionnelle.If any positional formatting is used, all format specifiers must use positional formatting. 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.However, printf_p and related functions still support non-positional parameters in format strings containing no positional parameters.

ExemplesExample

// 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 aussiSee also

Syntaxe de spécification de format : fonctions printf et wprintfFormat Specification Syntax: printf and wprintf Functions