printf / snprintf格式字符%N有什么作用? (不是%n)

时间:2014-11-24 20:09:16

标签: c++

正在查看一些旧代码并发现:

char buf[...];
int i = 1, j =2;
snprintf(buf, "%d-blah_%d-blah_%N", i, j);

只注意两个传递的vararg参数,但是3个格式字符串。

打印

1-blah_2-blah_0

无法在任何文档中找到此内容。 %N做什么?

2 个答案:

答案 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。