正在查看一些旧代码并发现:
char buf[...];
int i = 1, j =2;
snprintf(buf, "%d-blah_%d-blah_%N", i, j);
只注意两个传递的vararg参数,但是3个格式字符串。
打印
1-blah_2-blah_0
无法在任何文档中找到此内容。 %N做什么?
答案 0 :(得分:7)
根据标准文档(例如POSIX printf),它没有定义任何内容(因此%N
可能是undefined behavior,并且在标准中肯定是未指定的行为。)
然而,GNU glibc提供customizing printf
个能力。您的程序可能已在(其他地方)注册register_printf_function来处理%N
。这是非标准,并且 GNU glibc
具体
(但是,这是一个方便的技巧,但你不能教GCC format
function attribute知道这个技巧。)。
答案 1 :(得分:1)
这是微软CRT中一个有趣的案例。似乎发生的事情是%N
被视为大小说明符,但最终它会被忽略。
您可以在<VSDIR>/VC/crt/src/output.c
找到来源,对于VS2013,您可以找到以下内容:
enum CHARTYPE {
...
CH_SIZE, /* 'h', 'l', 'L', 'N', 'F', 'w' */
...
};
'N'
也用于查找状态表。 The documentation says nothing about it,也没有提到'F'
。仔细检查源代码(case ST_SIZE
)后,结果'N'
,'F'
和'L'
(尽管文档!)是无操作大小修饰符。
因此,对于VS2013,在你的情况下,你得到1-blah_2-blah_
,而不是尾随0。