printf_p
parametri posizionali
I parametri posizionali consentono di specificare per numero l'argomento da sostituire in un campo in una stringa di formato. Sono disponibili le seguenti funzioni printf
di parametro posizionale:
Impostazione dei parametri posizionali
Indicizzazione dei parametri
Per impostazione predefinita, se non è presente alcuna formattazione posizionale, le funzioni posizionali si comportano in modo identico a quelle non posizionali. Il parametro posizionale da formattare viene specificato inserendo %n$
all'inizio dell'identificatore di formato, dove n
corrisponde alla posizione del parametro da formattare all'interno dell'elenco dei parametri. La posizione del parametro parte da 1 per il primo argomento dopo la stringa del formato. La restante parte dell'identificatore di formato segue le stesse regole dell'identificatore di formato printf
. Per altre informazioni sugli identificatori di formato, vedere Sintassi delle specifiche di formato: printf
e wprintf
funzioni.
Di seguito è riportato un esempio di formattazione posizionale:
_printf_p("%1$s %2$s", "November", "10");
Questo esempio stampa:
November 10
Non è necessario che l'ordine dei numeri usati corrisponda a quello degli argomenti specificati. Ad esempio, ecco una stringa di formato valida:
_printf_p("%2$s %1$s", "November", "10");
Questo esempio stampa:
10 November
A differenza delle stringhe di formato tradizionali, i parametri posizionali possono essere usati più volte in una stringa di formato. ad esempio:
_printf_p("%1$d times %1$d is %2$d", 10, 100);
Questo esempio stampa:
10 times 10 is 100
Tutti gli argomenti devono essere usati almeno una volta in un punto della stringa di formato. Il numero massimo di parametri posizionali consentiti in una stringa di formato è indicato dal valore _ARGMAX
.
Larghezza e precisione
È possibile usare *n$
per specificare un parametro posizionale come identificatore di larghezza o precisione, dove n
corrisponde alla posizione del parametro di larghezza o precisione all'interno dell'elenco dei parametri. La posizione del valore di larghezza o precisione deve essere visualizzata immediatamente dopo il simbolo * . Ad esempio,
_printf_p("%1$*2$s","Hello", 10);
or
_printf_p("%2$*1$s", 10, "Hello");
Combinazione di argomenti posizionali e non posizionali
I parametri posizionali non possono essere combinati con i parametri non posizionali nella stessa stringa di formato. Se viene usata una formattazione posizionale, tutti gli identificatori di formato devono usare tale formattazione. Tuttavia, printf_p
e l funzioni correlate supportano ancora i parametri non posizionali nelle stringhe di formato che non contengono parametri posizionali.
Esempio
// 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
Vedi anche
Sintassi della specifica del formato: printf
e wprintf
funzioni