(GCC) знак доллара в строке формата printf

Я видел следующую строку в исходном коде, написанном на C:

printf("%2$d %1$d", a, b);

что это значит?

2 ответов


Это расширение языка, добавленного POSIX (поведение, совместимое с C11, должно быть описано в ответе @chux). Нотация %2$d означает то же самое как %d (выходное целое число со знаком), За исключением того, что он форматирует параметр с заданным числом на основе 1 (в вашем случае это второй параметр,b).

Итак, при запуске следующего кода:

#include <stdio.h>
int main() {
    int a = 3, b = 2;
    printf("%2$d %1$d", a, b);
    return 0;
}

вы получаете 2 3 в стандартный вывод.

больше информации можно найти на printf man pages.


в спецификации C C11dr 7.21.6.1

как часть формата печати, первый % на "%2$d %1$d" вводит директивы. Эта директива может иметь различные флаги, ширину, точность, модификатор длины и, наконец, спецификатор преобразования. В этом случае 2 - это ширина. Следующий персонаж $ ни точность, ни модификатор длины ни спецификатор преобразования. Таким образом, поскольку спецификация преобразования недопустима,

... поведение не определено. C11dr 7.21.6.1 9

спецификация C обсуждает будущие направления библиотеки. Строчные буквы могут быть добавлены в будущем, а другие символы могут использоваться в расширениях. Конечно!--3--> не является строчной буквой, так что это хорошо для будущего. Это, безусловно, соответствует роли "другого персонажа" как $ даже не является частью набора символов C.

в различных реализациях * nix,$ используется, как описано в руководство программиста Linux PRINTF (3). Этот $, вместе с предыдущим целым числом определяет индекс аргумента ширины.