Parametri posizionali printf_p

I parametri posizionali consentono di specificare in modo numerico gli argomenti da sostituire in un campo in una stringa di formato. Sono disponibili le seguenti funzioni printf di parametro posizionale:

Funzioni printf non posizionali Equivalenti di parametri posizionali
printf, _printf_l, wprintf, _wprintf_l _printf_p, _printf_p_l, _wprintf_p, _wprintf_p_l
sprintf, _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_l
fprintf, _fprintf_l, fwprintf, _fwprintf_l _fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_l
vprintf, _vprintf_l, vwprintf, _vwprintf_l _vprintf_p, _vprintf_p_l, _vwprintf_p, _vwprintf_p_l
vfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l _vfprintf_p, _vfprintf_p_l, _vfwprintf_p, _vfwprintf_p_l
vsprintf, _vsprintf_l, vswprintf, _vswprintf_l, __vswprintf_l _vsprintf_p, _vsprintf_p_l, _vswprintf_p, _vswprintf_p_l

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 per la specifica del formato: funzioni printf wprintf.

Di seguito è riportato un esempio di formattazione posizionale:

_printf_p("%1$s %2$s", "November", "10");  

Verrà stampato quanto segue:

November 10  

Non è necessario che l'ordine dei numeri usati corrisponda a quello degli argomenti specificati. Ad esempio, la stringa di formato seguente è valida:

_printf_p("%2$s %1$s", "November", "10");  

Verrà stampato quanto segue:

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);  

Verrà stampato quanto segue:

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 della larghezza o della precisione deve essere visualizzata subito dopo il simbolo *. Ad esempio,

_printf_p("%1$*2$s","Hello", 10);  

oppure

_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

Vedere anche

Sintassi per la specifica del formato: funzioni printf e wprintf