Parâmetros posicionais printf_p
Os parâmetros posicionais fornecem a capacidade de especificar o número de argumentos deve ser substituído em um campo em uma cadeia de caracteres de formato. As seguintes funções de printf de parâmetro posicional estão disponíveis:
printf, _printf_l, wprintf, _wprintf_l
_printf_p, _printf_p_l, _wprintf_p, _wprintf_p_lsprintf, _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_lfprintf, _fprintf_l, fwprintf, _fwprintf_l
_fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_lvprintf, _vprintf_l, vwprintf, _vwprintf_l
_vprintf_p, _vprintf_p_l, _vwprintf_p, _vwprintf_p_lvfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l
_vfprintf_p, _vfprintf_p_l, _vfwprintf_p, _vfwprintf_p_lvsprintf, _vsprintf_l, vswprintf, _vswprintf_l, __vswprintf_l
_vsprintf_p, _vsprintf_p_l, _vswprintf_p, _vswprintf_p_l
Especificando parâmetros posicionais
Indexação de parâmetro
Por padrão as funções posicionais se comportam não idêntica à posição, se nenhuma formatação posicional estiver presente. Os parâmetros posicionais forem especificados usando o formato “%m$x”, onde m denota um número ordinal numérico que indica a posição do parâmetro na lista de parâmetros, precedendo a cadeia de caracteres de formato e x indica o tipo de caractere do campo do tipo especificado na função de printf . Os parâmetros da lista são iniciar indexado no valor 1 para o primeiro elemento na lista e assim por diante. Para obter informações adicionais quanto aos caracteres de campo de tipo, consulte Caracteres de campo de tipo printf.
Para obter um exemplo desse comportamento:
_printf_p("%1$s %2$s", "November", "10");
imprimirá
November 10
A ordem dos números usados não precisa corresponder à ordem dos argumentos determinados. Portanto o seguinte é válida:
_printf_p("%2$s %1$s", "November", "10");
imprimirá
10 November
O parâmetro pode ser usada mais de uma vez, diferentemente ao formatar nas cadeias de formato tradicionais, de modo que
_printf_p("%{1$d times %1$d is %2$d", 10, 100);
imprimirá
10 times 10 is 100
No entanto, os argumentos devem ser usados pelo menos uma vez em algum lugar da cadeia de caracteres de formato.
O número máximo de parâmetros posicionais permitidos em uma cadeia de formato é determinado por _ARGMAX.
Largura e previsão
Quando o símbolo * é usado para especificar que a largura ou precisão devem ser determinada de um argumento, a posição da largura ou do valor de previsão deve aparecer imediatamente depois do símbolo *. Por exemplo,
_printf_p("%1$*2$s","Hello", 10);
ou
_printf_p("%2$*1$s",10, "Hello");
Argumentos posicionais e não posicionais da combinação
Os parâmetros posicionais não podem ser combinados com os parâmetros posicionais não na mesma cadeia de formato. No entanto, printf_s e as funções relacionadas ainda não oferecem suporte a parâmetros posicionais nas cadeias de formato que não contêm nenhum parâmetro posicional.
Exemplo
// 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);
}
Consulte também
Referência
Caracteres de campo de tipo printf