printf_p
Parâmetros posicionais
Os parâmetros posicionais permitem especificar por número o argumento a ser substituído em um campo em uma cadeia de caracteres de formato. As funções printf
do seguinte parâmetro posicional estão disponíveis:
Como especificar parâmetros posicionais
Indexação de parâmetro
Por padrão, se nenhuma formatação posicional estiver presente, as funções posicionais tem comportamento idêntico as não posicionais. Especifique o parâmetro posicional para formatar usando %n$
no início do especificador de formato, em que n
é a posição do parâmetro para o formato na lista de parâmetros. A posição de parâmetro começa em 1 para o primeiro argumento após a cadeia de caracteres de formato. O restante do especificador de formato segue as mesmas regras que o printf
especificador de formato. Para obter mais informações sobre especificadores de formato, consulte Sintaxe de especificação de formato: printf
e wprintf
funções.
Aqui está um exemplo de formatação posicional:
_printf_p("%1$s %2$s", "November", "10");
Este exemplo imprime:
November 10
A ordem dos números usada não precisa corresponder à ordem dos argumentos fornecidos. Por exemplo, aqui está uma cadeia de caracteres de formato válida:
_printf_p("%2$s %1$s", "November", "10");
Este exemplo imprime:
10 November
Ao contrário de cadeias de caracteres de formato tradicional, parâmetros posicionais podem ser usados mais de uma vez em uma cadeia de caracteres de formato. Por exemplo,
_printf_p("%1$d times %1$d is %2$d", 10, 100);
Este exemplo imprime:
10 times 10 is 100
Todos os argumentos devem ser usados pelo menos uma vez em algum lugar na cadeia de caracteres de formato. O número máximo de parâmetros posicionais permitidos em uma cadeia de caracteres de formato é dado por _ARGMAX
.
Largura e Precisão
Você pode usar *n$
para especificar um parâmetro posicional como um especificador de precisão ou de largura, em que n
é a posição da largura ou precisão do parâmetro na lista de parâmetros. A posição do valor de largura ou precisão deve aparecer imediatamente seguinte ao símbolo *. Por exemplo,
_printf_p("%1$*2$s","Hello", 10);
ou
_printf_p("%2$*1$s", 10, "Hello");
Combinando argumentos posicionais e não posicionais
Parâmetros posicionais não podem ser combinados com parâmetros não posicionais na mesma cadeia de caracteres de formato. Se qualquer formatação posicional for usada, todos os especificadores de formato devem usar a formatação posicional. No entanto, printf_p
e funções relacionadas ainda dão suporte a parâmetros não posicionais em cadeias de caracteres de formato que não contém parâmetros posicionais.
Exemplo
// 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
Confira também
Sintaxe de especificação de formato: printf
e wprintf
funções