Parametri posizionali printf_p
I parametri posizionali consentono di specificare il numero di argomenti che deve essere sostituito all'interno di un campo in una stringa di formato. Le seguenti funzioni di printf del parametro posizionale sono disponibili:
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
Specificare i parametri posizionali
Indicizzazione di parametro
Per impostazione predefinita le funzioni posizionali si comportano in modo identico a quelle non posizionali, se non è presente alcuna formattazione posizionale. I parametri posizionali sono specificati usando il formato "%m$x", dove m indica un numero ordinale numerico che indica la posizione del parametro nell'elenco dei parametri, precedenti alla stringa di formato e x indica il tipo di carattere del campo del tipo specificato nella funzione printf. I parametri nell'elenco sono indicizzati a partire dal valore 1 per il primo elemento nell'elenco e così via. Per informazioni aggiuntive relative ai caratteri di campo del tipo, vedere Caratteri di campo di tipo per printf.
Per un esempio su questo comportamento:
_printf_p("%1$s %2$s", "November", "10");
stamperà
November 10
L'ordine dei numeri utilizzati non deve corrispondere all'ordine degli argomenti forniti. Quindi la seguente sintassi è valida:
_printf_p("%2$s %1$s", "November", "10");
stamperà
10 November
Il parametro può essere utilizzato più volte durante la formattazione, a differenza delle stringhe di formato tradizionali, in modo tale che
_printf_p("%{1$d times %1$d is %2$d", 10, 100);
stamperà
10 times 10 is 100
Tuttavia, tutti gli argomenti devono essere utilizzati almeno una volta da qualche parte nella stringa di formato.
Il numero massimo di parametri posizionali consentiti in una stringa di formato è fornito da _ARGMAX.
Larghezza e previsione
Quando il simbolo * viene utilizzato per specificare che la larghezza o la precisione è determinata da un argomento, la posizione della larghezza o un valore di previsione deve trovarsi immediatamente dopo il simbolo *. Di seguito è riportato un esempio:
_printf_p("%1$*2$s","Hello", 10);
o
_printf_p("%2$*1$s",10, "Hello");
Combinare argomenti posizionali e non posizionali
I parametri posizionali non possono essere combinati con parametri non posizionali nella stessa stringa di formato. Tuttavia, printf_s e funzioni relative supportano ancora i parametri non posizionali nelle stringhe di formato non contenenti parametri posizionali.
Esempio
// 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);
}
Vedere anche
Riferimenti
Caratteri di campo di tipo per printf