(GCC) Dollar sign in printf format string

隐身守侯 提交于 2020-01-28 05:12:09

问题


I've seen the following line in a source code written in C:

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

What does it mean?


回答1:


It's an extension to the language added by POSIX (C11-compliant behaviour should be as described in an answer by @chux). Notation %2$d means the same as %d (output signed integer), except it formats the parameter with given 1-based number (in your case it's a second parameter, b).

So, when you run the following code:

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

you'll get 2 3 in standard output.

More info can be found on printf man pages.




回答2:


Per the C spec C11dr 7.21.6.1

As part of a print format, the first % in "%2$d %1$d" introduces a directive. This directive may have various flags, width, precision, length modifier and finally a conversion specifier. In this case 2 is a width. The next character $ is neither a precision, length modifier nor conversion specifier. Thus since the conversion specification is invalid,

... the behavior is undefined. C11dr 7.21.6.1 9

The C spec discusses future library directions. Lower case letters may be added in the future and other characters may be used in extensions. Of course $ is not a lower case letter, so that is good for the future. It certainly fits the "other character" role as $ is not even part of the C character set.

In various *nix implementations, $ is used as describe in Linux Programmer's Manual PRINTF(3). The $, along with the preceding integer defines the argument index of the width.



来源:https://stackoverflow.com/questions/19327441/gcc-dollar-sign-in-printf-format-string

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!