我正在查看一些旧代码,发现了以下内容:
char buf[...];
int i = 1, j =2;
snprintf(buf, "%d-blah_%d-blah_%N", i, j);
请注意只有两个可变参数被传递,但有3个格式化字符串。
它会打印:
1-blah_2-blah_0
无法在任何文档中找到此信息。 %N 是什么意思?
我正在查看一些旧代码,发现了以下内容:
char buf[...];
int i = 1, j =2;
snprintf(buf, "%d-blah_%d-blah_%N", i, j);
请注意只有两个可变参数被传递,但有3个格式化字符串。
它会打印:
1-blah_2-blah_0
无法在任何文档中找到此信息。 %N 是什么意思?
%N
可能是 未定义行为,并且在标准中肯定是未指定的行为)。printf
的能力。你的程序可能已经在其他地方使用register_printf_function注册了处理%N
的函数。这不是标准,而且只适用于GNU glibc
(虽然这是一个方便的技巧,但你不能教GCC format
函数属性知道这个技巧)。%N
被视为大小说明符,但最终它被忽略了。<VSDIR>/VC/crt/src/output.c
中找到源代码,对于VS2013,您将找到以下行:enum CHARTYPE {
...
CH_SIZE, /* 'h', 'l', 'L', 'N', 'F', 'w' */
...
};
'N'
也被用于查找状态表。文档中没有提到, 也没有提到'F'
。仔细检查源代码 (case ST_SIZE
),发现'N'
, 'F'
和'L'
(尽管文档中没有!)是无操作大小修饰符。
因此,在您的情况下,对于VS2013,您将获得1-blah_2-blah_
,没有尾随0。