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:
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
Vea también
Sintaxis de especificación de formato: printf
y wprintf
funciones