Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 _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 *. 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