Поделиться через


Позиционные параметры printf_p

Позиционные параметры предоставляют возможность определить число аргументов, которые будут заменены в поле в строке формата. Доступны следующие функции printf с позиционным параметром:

Определение позиционных параметров

Индексирование параметра

По умолчанию поведение позиционных функций совпадает с поведением непозиционных, если позиционное форматирование отсутствует. Позиционные параметры задаются в формате «%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);
}
  

См. также

Ссылки

Символы поля типа printf

Спецификация ширины printf

Спецификация точности