Позиционные параметры printf_p
Позиционные параметры предоставляют возможность определить число аргументов, которые будут заменены в поле в строке формата. Доступны следующие функции printf с позиционным параметром:
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
Определение позиционных параметров
Индексирование параметра
По умолчанию поведение позиционных функций совпадает с поведением непозиционных, если позиционное форматирование отсутствует. Позиционные параметры задаются в формате «%m$x», где m обозначает порядковый номер, указывающий позицию параметра в списке параметров, предшествующих строке формата, а x обозначает символ поля типа для типа, указанного в функции printf. Параметры в списке проиндексированы, начиная со значения 1 для первого элемента в списке и т. д. Дополнительные сведения относительно символов поля типа см. в разделе Символы поля типа printf.
Пример такого поведения:
_printf_p("%1$s %2$s", "November", "10");
напечатает
November 10
Порядок используемых чисел не совпадает с порядком, в котором даны аргументы. Таким образом, следующее выражение допустимо:
_printf_p("%2$s %1$s", "November", "10");
напечатает
10 November
Параметр может использоваться более одного раза при форматировании, в отличие от обычных строк формата, поэтому
_printf_p("%{1$d times %1$d is %2$d", 10, 100);
напечатает
10 times 10 is 100
Однако все в строке формата аргументы должны использоваться по крайней мере один раз.
Максимальное число разрешенных позиционных параметров в строке формата задается _ARGMAX.
Ширина и точность
Если символ * используется для указания того, что ширина или точность должны определяться из аргумента, то позиция ширины или точности должна быть указана сразу за символом *. Например:
_printf_p("%1$*2$s","Hello", 10);
или
_printf_p("%2$*1$s",10, "Hello");
Смешивание позиционных и непозиционных аргументов
Позиционные параметры не могут быть смешаны с непозиционными параметрами в одной строке формата. Однако printf_s и связанные функции еще поддерживают непозиционные параметры в строке формата, не содержащей позиционных параметров.
Пример
// 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);
}