(GCC)美元符号printf格式字符串

时间:2013-10-11 21:20:18

标签: c gcc format printf

我在用C:

编写的源代码中看到了以下行
printf("%2$d %1$d", a, b);

这是什么意思?

2 个答案:

答案 0 :(得分:24)

这是extension to the language added by 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找到更多信息。

答案 1 :(得分:11)

根据C规范C11dr 7.21.6.1

作为打印格式的一部分,%中的第一个"%2$d %1$d"引入了一个指令。该指令可能有各种标志,宽度,精度,长度修饰符,最后还有转换说明符。在这种情况下,2是宽度。下一个字符$既不是精度,长度修饰符也不是转换说明符。因此,由于转换规范无效,

......行为未定义。 C11dr 7.21.6.1 9

C规范讨论了未来的图书馆方向。可以在将来添加小写字母,并且可以在扩展中使用其他字符。当然$不是小写字母,所以这对未来有好处。它当然适合“其他角色”角色,因为$甚至不是C字符集的一部分。

在各种* nix实现中,$用作Linux Programmer's Manual PRINTF(3)中的描述。 $和前面的整数定义了宽度的参数索引。