printf_p positionelle Parameter
Positionsgebundene Parameter angeben die Möglichkeit, um anzugeben, die Anzahl der Argumente in ein Feld in einer Formatzeichenfolge ersetzt werden soll.Die folgenden printf-Funktionen des positionsgebundenen Parameters sind verfügbar:
printf, _printf_l, wprintf, _wprintf_l
_printf_p, _printf_p_l, _wprintf_p, _wprintf_p_lsprintf, _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_lfprintf, _fprintf_l, fwprintf, _fwprintf_l
_fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_lvprintf, _vprintf_l, vwprintf, _vwprintf_l
_vprintf_p, _vprintf_p_l, _vwprintf_p, _vwprintf_p_lvfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l
_vfprintf_p, _vfprintf_p_l, _vfwprintf_p, _vfwprintf_p_lvsprintf, _vsprintf_l, vswprintf, _vswprintf_l, __vswprintf_l
_vsprintf_p, _vsprintf_p_l, _vswprintf_p, _vswprintf_p_l
Positionsgebundene Parameter angeben
Parameter-Indizierung
Standardmäßig verhalten sich nicht auf die positionale Funktionen identisch sein, wenn keine Position eine positionelle Formatierung vorhanden ist.Positionsgebundene Parameter werden mithilfe des angegebenen Formats „%m$x“, wobei m eine numerische Ordinalzahl bezeichnet, die die Position des Parameters in der Liste der Parameter angibt und fahren der Formatzeichenfolge voraus undx bezeichnet den Typ feld-Schrifttyp, der in der printf-Funktion angegeben wird.Die Parameter in der Liste sind indiziertes usw.) beginnen am Wert 1 für das erste Element in der Liste.Zusätzliche Informationen hinsichtlich der Zeichen im Feld Typ finden Sie unter printf-Typ-Feld-Zeichen.
Ein Beispiel für dieses Verhalten:
_printf_p("%1$s %2$s", "November", "10");
druckt
November 10
Die Reihenfolge der Zahlen, die verwendet werden muss, nicht die Reihenfolge der angegebenen Argumente übereinstimmt.Daher ist das nächste gültig:
_printf_p("%2$s %1$s", "November", "10");
druckt
10 November
Parameter kann mehrmals, wenn die Formatierung anders als in herkömmlichen Formatierungszeichenfolgen, damit verwendet werden.
_printf_p("%{1$d times %1$d is %2$d", 10, 100);
druckt
10 times 10 is 100
Allerdings müssen alle Argumente in der Formatzeichenfolge mindestens einmal verwendet werden.
Die maximale Anzahl von positionsgebundenen Parametern, die in einer Formatzeichenfolge zulässig sind, ist durch _ARGMAXangegeben.
Vorhersage und Breite
Wenn das Symbol * wird verwendet, um anzugeben, dass die Breite oder die Genauigkeit von einem Argument bestimmt werden soll, muss die Position der Breite oder Vorhersagen für Symbol * werden unmittelbar folgt.Beispiel:
_printf_p("%1$*2$s","Hello", 10);
oder
_printf_p("%2$*1$s",10, "Hello");
Kombinieren und Position nicht positionellen Argumente
Positionsgebundene Parameter nicht mit nicht-Positions Parametern in der gleichen Formatzeichenfolge kombiniert werden.printf_s und zugehörige Funktionen unterstützen jedoch noch nicht-Positions von Parametern in Formatzeichenfolgen, die keine Positionsparameter enthalten.
Beispiel
// 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 argc, char *argv[])
{
int i = 1,
j = 2,
k = 3;
double x = 0.1,
y = 0.2,
z = 0.3;
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 args are numbers indicating the
// argument enclosed in curly braces.
_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);
_printf_p("%1$s %2$s %3$s\n", s1, s2, s3);
_printf_p("%3$s %1$s %2$s\n", s1, s2, s3);
}