printf_p parámetros posicionales

Los parámetros posicionales permiten especificar por número el argumento que se va a sustituir en un campo en una cadena de formato. Las siguientes funciones printf de parámetros de posición están disponibles:

Funciones de printf no posicional Equivalentes de parámetro posicional
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

Especificación de parámetros de posición

Indexación de parámetros

De forma predeterminada las funciones de posición se comportan exactamente igual que las funciones que no son de posición, si no hay presente formato de posición. Los parámetros de posición se especifican utilizando el formato %n$ al principio del especificador de formato, donde n es la posición del parámetro en la lista de parámetros. La posición del parámetro comienza en 1 para el primer argumento después de la cadena de formato. El resto del especificador de formato sigue las mismas reglas que el especificador de formato de printf. Para obtener más información sobre los especificadores de formato, vea Sintaxis de especificación de formato: printf y wprintf funciones.

Este es un ejemplo del formato de posición:

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

En este ejemplo se imprime:

November 10

No es necesario que el orden de los números utilizados coincida con el orden de los argumentos. Por ejemplo, esta es una cadena de formato válida:

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

En este ejemplo se imprime:

10 November

A diferencia de las cadenas de formato tradicional, los parámetros de posición se pueden usar más de una vez en una cadena de formato. Por ejemplo,

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

En este ejemplo se imprime:

10 times 10 is 100

Todos los argumentos se deben utilizar al menos una vez en algún lugar de la cadena de formato. El número máximo de parámetros de posición permitidos en una cadena de formato lo proporciona _ARGMAX.

Ancho y precisión

Puede usar *n$ para especificar un parámetro de posición como un especificador de precisión o de ancho, donde n es la posición del parámetro de precisión o de ancho en la lista de parámetros. La posición del valor de precisión o de ancho debe aparecer inmediatamente después del símbolo *. Por ejemplo,

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

o

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

Mezcla de argumentos de posición y no posición

Los parámetros de posición no se pueden mezclar con parámetros no que no sean de posición en la misma cadena de formato. Si se utiliza cualquier formato de posición, todos los especificadores de formato deben usar el formato de posición. Sin embargo, las funciones printf_p y las funciones relacionadas todavía admiten parámetros que no sean de posición en cadenas de formato que no contengan parámetros de posición.

Ejemplo

// 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

Consulte también

Sintaxis de especificación de formato: printf y wprintf funciones