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:
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. Na 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 _ARGMAX
element .
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 *. Na 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