Paramètres positionnels printf_p

 

Pour obtenir la dernière documentation sur Visual Studio 2017, consultez Documentation Visual Studio 2017.

Les paramètres positionnels permettent de spécifier à l'aide d'un nombre l'argument à remplacer dans un champ de chaîne de format. Voici les fonctions printf avec paramètres positionnels disponibles :

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

Indexation des paramètres

Par défaut, les fonctions positionnelles se comportent comme les fonctions non positionnelles, en l'absence de format positionnel. Les paramètres positionnels sont spécifiés à l'aide du format "%m$x", où m représente un nombre ordinal indiquant la position du paramètre dans la liste des paramètres, avant la chaîne de format, et où x représente le type de caractère de champ de type spécifié dans la fonction printf. Les paramètres de la liste sont indexés à partir de la valeur 1 pour le premier élément de la liste, et ainsi de suite. Pour plus d'informations sur les caractères du champ de type, consultez Caractères du champ de type printf.

Pour obtenir un exemple de ce comportement :

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

affiche

November 10  

Il n'est pas nécessaire que l'ordre des nombres utilisés corresponde à l'ordre des arguments donné. Ce qui suit est donc valide :

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

affiche

10 November  

Comme le paramètre peut être utilisé plusieurs fois durant la mise en forme, contrairement aux chaînes de format classiques, la ligne ci-dessous

_printf_p("%1$d times %1$d is %2$d", 10, 100);  

affiche

10 times 10 is 100  

Toutefois, tous les arguments doivent être utilisés au moins une fois dans la chaîne de format.

Le nombre maximal de paramètres positionnels autorisés dans une chaîne de format est fourni par _ARGMAX.

Largeur et précision

Quand le symbole * est utilisé pour spécifier que la largeur ou la précision doit être déterminée à partir d'un argument, la position de la valeur de largeur ou de précision doit se trouver immédiatement après le symbole *. Par exemple :

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

ou

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

Mélange d'arguments positionnels et non positionnels

Les paramètres positionnels ne doivent pas être mélangés avec des paramètres non positionnels dans la même chaîne de format. Toutefois, printf_p et les fonctions connexes prennent toujours en charge les paramètres non positionnels dans les chaînes de format qui contiennent des paramètres positionnels.

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

1 2 3
3 1 2
1 2 1
abc def ghi
ghi abc def

Caractères du champ de type printf
Spécification de largeur printf
Spécifications de précision

Afficher: