printf_p Parametry pozycyjneprintf_p Positional Parameters

Parametry pozycyjne zapewniają możliwość określenia przez liczbę argumentów, które mają zostać zastąpione w polu w ciągu formatu.Positional parameters provide the ability to specify by number which of the arguments is to be substituted into a field in a format string. Dostępne są następujące funkcje parametrów pozycyjnych printf :The following positional parameter printf functions are available:

Niepozycyjne funkcje printfNon-positional printf functions Równoważne parametry pozycyjnePositional 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

Jak określić parametry pozycyjneHow to specify positional parameters

Indeksowanie parametrówParameter indexing

Domyślnie, jeśli nie ma żadnego formatowania pozycyjnyego, funkcje pozycyjne zachowują się identycznie do tych, które nie są pozycjonowane.By default, if no positional formatting is present, the positional functions behave identically to the non-positional ones. Należy określić parametr pozycyjny do formatowania przy użyciu %n$ na początku specyfikatora formatu, gdzie n jest pozycją parametru do sformatowania na liście parametrów.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. Pozycja parametru rozpoczyna się od 1 dla pierwszego argumentu po ciągu formatu.The parameter position starts at 1 for the first argument after the format string. Pozostała część specyfikatora formatu jest zgodna z tymi samymi regułami, które są zgodne ze printf specyfikatorem formatu.The remainder of the format specifier follows the same rules as the printf format specifier. Aby uzyskać więcej informacji na temat formatu specfiers, zobacz składnia specyfikacji formatowania: printf i wprintf Functions.For more information about format specfiers, see Format Specification Syntax: printf and wprintf Functions.

Oto przykładowe formatowanie pozycyjne:Here's an example of positional formatting:

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

Ten wydruk jest następujący:This prints:

November 10

Kolejność użytych liczb nie musi być zgodna z kolejnością argumentów.The order of the numbers used doesn't need to match the order of the arguments. Na przykład jest to prawidłowy ciąg formatu:For example, this is a valid format string:

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

Ten wydruk jest następujący:This prints:

10 November

W przeciwieństwie do tradycyjnych ciągów formatowania, parametry pozycyjne mogą być używane więcej niż raz w ciągu formatu.Unlike traditional format strings, positional parameters may be used more than once in a format string. Przykład:For example,

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

Ten wydruk jest następujący:This prints:

10 times 10 is 100

Wszystkie argumenty muszą być używane co najmniej raz w ciągu formatu.All arguments must be used at least once somewhere in the format string. Maksymalna liczba parametrów pozycyjnych dozwolonych w ciągu formatu jest określona przez _ARGMAX .The maximum number of positional parameters allowed in a format string is given by _ARGMAX.

Szerokość i precyzjaWidth and precision

Można użyć, *n$ Aby określić parametr pozycyjny jako szerokość lub specyfikator dokładności, gdzie n jest pozycją parametru Width lub dokładności na liście parametrów.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. Pozycja wartości Width lub dokładności musi występować bezpośrednio po * symbolu.The position of the width or precision value must appear immediately following the * symbol. Przykład:For example,

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

lubor

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

Mieszanie argumentów pozycyjnych i niepozycyjnychMixing positional and non-positional arguments

Parametry pozycyjne nie mogą być mieszane z parametrami niepozycyjnymi w tym samym ciągu formatu.Positional parameters may not be mixed with non-positional parameters in the same format string. Jeśli używane jest dowolne formatowanie pozycyjne, wszystkie specyfikatory formatu muszą używać formatowania pozycyjnego.If any positional formatting is used, all format specifiers must use positional formatting. Jednak printf_p funkcje pokrewne nadal obsługują parametry niepozycyjnye w ciągach formatujących, które nie zawierają parametrów pozycyjnych.However, printf_p and related functions still support non-positional parameters in format strings containing no positional parameters.

PrzykładExample

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

Zobacz takżeSee also

Składnia specyfikacji formatu: funkcje printf i wprintfFormat Specification Syntax: printf and wprintf Functions