printf_p
poziční parametry
Poziční parametry umožňují zadat podle čísla argumentu, který se má nahradit do pole v řetězci formátu. K dispozici jsou následující funkce pozičních parametrů printf
:
Určení pozičních parametrů
Indexování parametrů
Pokud není k dispozici žádné poziční formátování, poziční funkce se ve výchozím nastavení chovají stejně jako nepoziční funkce. Poziční parametr, který se má formátovat, zadáte na %n$
začátku specifikátoru formátu, kde n
je pozice parametru pro formátování v seznamu parametrů. Pozice parametru začíná na 1 pro první argument za formátovacím řetězcem. Zbývající část specifikátoru formátu se řídí stejnými pravidly jako printf
specifikátor formátu. Další informace o specifikátorech formátu naleznete v tématu Syntaxe specifikace formátu: printf
a wprintf
funkce.
Tady je příklad polohového formátování:
_printf_p("%1$s %2$s", "November", "10");
Tento příklad vytiskne:
November 10
Pořadí použitých čísel nemusí odpovídat pořadí argumentů. Tady je například platný formátovací řetězec:
_printf_p("%2$s %1$s", "November", "10");
Tento příklad vytiskne:
10 November
Na rozdíl od tradičních formátových řetězců lze v řetězci formátu použít poziční parametry více než jednou. Příklad:
_printf_p("%1$d times %1$d is %2$d", 10, 100);
Tento příklad vytiskne:
10 times 10 is 100
Všechny argumenty musí být použity alespoň jednou v řetězci formátu. Maximální počet pozičních parametrů povolených v řetězci formátu je dán ._ARGMAX
Šířka a přesnost
Můžete použít *n$
k zadání pozičního parametru jako specifikátoru šířky nebo přesnosti, kde n
je pozice parametru width nebo precision v seznamu parametrů. Pozice hodnoty šířky nebo přesnosti se musí zobrazit bezprostředně za symbolem *. Příklad:
_printf_p("%1$*2$s","Hello", 10);
nebo
_printf_p("%2$*1$s", 10, "Hello");
Míchání pozičních a nepozičních argumentů
Poziční parametry nemusí být smíšené s nepozičními parametry ve stejném řetězci formátu. Pokud se použije jakékoli poziční formátování, musí všechny specifikátory formátu používat poziční formátování. printf_p
Související funkce však stále podporují nepoziční parametry ve formátových řetězcích, které neobsahují žádné poziční parametry.
Příklad
// 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