printf_p
Positionsparameter
Mithilfe von Positionsparametern können Sie das Argument angeben, das in einem Feld in einer Formatzeichenfolge ersetzt werden soll. Die folgenden printf
-Positionsparameterfunktionen sind verfügbar:
Angeben von Positionsparametern
Parameterindizierung
Standardmäßig verhalten sich Positionsfunktionen und Nicht-Positionsfunktionen identisch, wenn keine Positionsformatierung vorhanden ist. Sie geben den zu formatierenden Positionsparameter an, indem Sie %n$
am Beginn des Formatbezeichners verwenden, wobei n
die Position des zu formatierenden Parameters in der Parameterliste ist. Die Parameterposition beginnt bei 1 für das erste Argument nach der Formatzeichenfolge. Der Rest des Formatbezeichners folgt den gleichen Regeln wie der printf
-Formatbezeichner. Weitere Informationen zu Formatbezeichnern finden Sie unter Formatspezifikationssyntax: printf
und wprintf
Funktionen.
Im Folgenden finden Sie ein Beispiel für die Positionsformatierung:
_printf_p("%1$s %2$s", "November", "10");
In diesem Beispiel wird gedruckt:
November 10
Die Reihenfolge der Zahlen muss nicht mit der Reihenfolge der Argumente übereinstimmen. Hier ist beispielsweise eine gültige Formatzeichenfolge:
_printf_p("%2$s %1$s", "November", "10");
In diesem Beispiel wird gedruckt:
10 November
Im Gegensatz zu herkömmlichen Formatzeichenfolgen können Positionsparameter in einer Formatzeichenfolge mehrmals verwendet werden. Beispiel:
_printf_p("%1$d times %1$d is %2$d", 10, 100);
In diesem Beispiel wird gedruckt:
10 times 10 is 100
Alle Argumente müssen mindestens einmal in der Formatzeichenfolge verwendet werden. Die maximale Anzahl von Positionsparametern, die in einer Formatzeichenfolge zulässig sind, ist durch _ARGMAX
angegeben.
Breite und Genauigkeit
Sie können *n$
verwenden, um einen Positionsparameter als Breiten- oder Genauigkeitsbezeichner anzugeben, wobei n
die Position des Breiten- oder Genauigkeitsbezeichners in der Parameterliste ist. Die Position des Werts für Breite oder Genauigkeit muss unmittelbar nach dem Symbol * angezeigt werden. Beispiel:
_printf_p("%1$*2$s","Hello", 10);
oder
_printf_p("%2$*1$s", 10, "Hello");
Mischen von Positions- und Nicht-Positionsargumenten
Positionsparameter dürfen nicht mit Nicht-Positionsparametern in der gleichen Formatzeichenfolge kombiniert werden. Wenn die Positionsformatierung verwendet wird, muss diese von allen Formatbezeichnern verwendet werden. printf_p
- und verwandte Funktionen unterstützen jedoch weiterhin Nicht-Positionsparameter in Formatzeichenfolgen ohne Positionsparameter.
Beispiel
// 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