Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Позиционные параметры позволяют указать по числу аргумента, заменяющего поле в строке формата. Доступны следующие функции 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 функции