Udostępnij za pośrednictwem


printf_p parametry pozycyjne

Parametry pozycyjne umożliwiają określenie przez liczbę argumentu, który ma zastąpić pole w ciągu formatu. Dostępne są następujące funkcje parametrów printf pozycyjnych:

Funkcje drukowania niepozycyjnego Odpowiedniki parametrów pozycyjnych
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

Jak określić parametry pozycyjne

Indeksowanie parametrów

Domyślnie, jeśli nie ma formatowania pozycyjnego, funkcje pozycyjne zachowują się identycznie z funkcjami niepozycyjnymi. Należy określić parametr pozycyjny do formatowania przy użyciu %n$ na początku specyfikatora formatu, gdzie n jest położeniem parametru do formatowania na liście parametrów. Pozycja parametru rozpoczyna się od 1 dla pierwszego argumentu po ciągu formatu. Pozostała część specyfikatora formatu jest zgodna z tymi samymi regułami co printf specyfikator formatu. Aby uzyskać więcej informacji na temat specyfikatorów formatu, zobacz Składnia specyfikacji formatu: printf i wprintf funkcje.

Oto przykład formatowania pozycyjnego:

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

Ten przykład drukuje:

November 10

Kolejność użytych liczb nie musi odpowiadać kolejności argumentów. Na przykład poniżej znajduje się prawidłowy ciąg formatu:

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

Ten przykład drukuje:

10 November

W przeciwieństwie do tradycyjnych ciągów formatu parametry pozycyjne mogą być używane więcej niż raz w ciągu formatu. Przykład:

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

Ten przykład drukuje:

10 times 10 is 100

Wszystkie argumenty muszą być używane co najmniej raz w ciągu formatu. Maksymalna liczba parametrów pozycyjnych dozwolonych w ciągu formatu jest podana przez _ARGMAXelement .

Szerokość i precyzja

Można użyć *n$ do określenia parametru pozycyjnego jako specyfikatora szerokości lub dokładności, gdzie n jest położeniem szerokości lub parametru precyzji na liście parametrów. Położenie wartości szerokości lub dokładności musi pojawić się bezpośrednio po symbolu *. Przykład:

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

lub

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

Mieszanie argumentów pozycyjnych i niepozycyjnych

Parametry pozycyjne mogą nie być mieszane z parametrami niepozycyjnymi w tym samym ciągu formatu. Jeśli jest używane dowolne formatowanie pozycyjne, wszystkie specyfikatory formatu muszą używać formatowania pozycyjnego. printf_p Jednak i powiązane funkcje nadal obsługują parametry niepozycyjne w ciągach formatu bez parametrów pozycyjnych.

Przykład

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

Składnia specyfikacji formatu: printf i wprintf funkcje