printf_p
позиционные параметры
Позиционные параметры позволяют указать по числу аргумента, заменяющего поле в строке формата. Доступны следующие функции printf
с позиционными параметрами:
Определение позиционных параметров
Индексирование параметров
Если позиционное форматирование отсутствует, поведение позиционных функций по умолчанию совпадает с поведением непозиционных. Позиционный параметр для форматирования задается символами %n$
в начале описателя формата, где n
— это позиция форматируемого параметра в списке параметров. Первый аргумент после строки форматирования имеет номер позиции 1. Для остальной части описателя формата действуют те же правила, что и для описателя формата printf
. Дополнительные сведения о описателях формата см. в разделе "Синтаксис спецификации формата" printf
и wprintf
"Функции".
Ниже приведен пример позиционного форматирования:
_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
.
Ширина и точность
С помощью *n$
можно указать позиционный параметр в качестве описателя ширины или точности, где n
обозначает позицию нужного параметра в списке параметров. Позиция значения ширины или точности должна отображаться сразу после символа *. Например,
_printf_p("%1$*2$s","Hello", 10);
or
_printf_p("%2$*1$s", 10, "Hello");
Сочетание позиционных и непозиционных аргументов
Позиционные параметры не могут смешиваться с непозиционными параметрами в одной строке формата. Если используется позиционное форматирование, для всех описателей формата необходимо использовать позиционное форматирование. Однако printf_p
и связанные функции еще поддерживают непозиционные параметры в строке формата, не содержащей позиционных параметров.
Пример
// 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
См. также
Синтаксис спецификации форматирования: printf
и wprintf
функции