printf_p-Positionsparameter
Positionelle Parameter bieten die Möglichkeit, von Zahl angeben, die der Argumente in ein Feld in einer Formatzeichenfolge ersetzt werden soll. Die folgenden printf-Funktionen des Positionsparameters 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
Angeben von positionaler Parameter
Parameter-Indizierung
Standardmäßig verhalten sich die Positionsfunktionen identisch zur Position keiner, wenn keine Positionsformatierung vorhanden ist. Positionelle Parameter angegeben im Format "%m$x", wobei m eine numerische Ordinalzahl gekennzeichnet, die der Position des Parameters in der Liste der Parameter angibt und Wechseln der Formatzeichenfolge vorangestellt und x bezeichnet den Typfeld-Schrifttyp, der in der printf-Funktion angegeben wird. Die Parameter in der Liste sind indiziertes usw. starten am Wert 1 für das erste Element in der Liste. Weitere Informationen hinsichtlich der Typfeldzeichen, finden Sie unter printf-Typenfeldzeichen.
Ein Beispiel für dieses Verhalten:
_printf_p("%1$s %2$s", "November", "10");
gibt
November 10
Die Reihenfolge der Zahlen, die verwendet werden, muss, nicht die Reihenfolge der Argumente angegebenen entspricht. Folgendes ist also gültig:
_printf_p("%2$s %1$s", "November", "10");
gibt
10 November
Parameter wird mehrmals beim Formatieren, anders als in traditionellen Formatzeichenfolgen, sodass verwendet werden
_printf_p("%{1$d times %1$d is %2$d", 10, 100);
gibt
10 times 10 is 100
Allerdings müssen alle Argumente einmal irgendwo in der Formatzeichenfolge mindestens verwendet werden.
Die maximale Anzahl der positionelle Parameter, die in einer Formatzeichenfolge werden können, wird durch _ARGMAX angegeben.
Breite und Prognose
Wenn das * " wird verwendet, um anzugeben, dass die Breite und die Genauigkeit von einem Argument bestimmt werden soll, muss die Position der Breite oder des Vorhersagenwerts direkt nach werden * ". Beispiel:
_printf_p("%1$*2$s","Hello", 10);
oder
_printf_p("%2$*1$s",10, "Hello");
Kombinieren positional und Positionsargumente nicht
Positionelle Parameter dürfen nicht mit nicht-Positionsparametern in der gleichen Formatzeichenfolge kombiniert werden. Sowohl printf_s und verwandte Funktionen noch nicht-Positionsparameter 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);
}