![](/img/trans.png)
[英]Why are arguments which do not match the conversion specifier in printf undefined behavior?
[英]Passing too few arguments to printf for the format specifier — is it undefined behavior?
据我所知,参数的格式说明符太少被认为是未定义的行为(并且格式说明符的参数太少也是未定义的行为)。 这适用于:
printf("%1$d %1$d", 5);
PS使用"%1$d"
作为格式说明符是POSIX添加的printf
系列的扩展 。
n$
表示法不是标准C的一部分,但是是POSIX的一部分。 printf()
的POSIX规范支持n$
表示法来引用参数。
转换可以应用于参数列表中的格式之后的第n个参数,而不是下一个未使用的参数。 在这种情况下,转换说明符字符
%
(见下文)被序列"%n$"
替换,其中n是[1,{NL_ARGMAX}]范围内的十进制整数,给出参数在参数中的位置名单。 此功能提供了格式字符串的定义,该字符串以适合特定语言的顺序选择参数(请参阅示例部分)。格式可以包含编号参数转换规范(即
"%n$"
和"*m$"
),或无编号参数转换规范(即%
和*
),但不能同时包含两者。 唯一的例外是%%
可以与"%n$"
表单混合使用。 在格式字符串中混合编号和未编号参数规范的结果是未定义的。 当使用带编号的参数规范时,指定第N个参数要求在格式字符串中指定从第一个到第(N-1)个的所有前导参数。在包含转换规范的
"%n$"
形式的格式字符串中,参数列表中的编号参数可以根据需要多次从格式字符串中引用。
它要求您为每个n$
提供一个参数,并且格式字符串引用每个参数1..n。 它并没有说你每次都必须使用不同的n$
。
显示的代码在POSIX系统上很好。 由于它仅使用POSIX功能,因此无法将其移植到没有必要支持作为扩展的非POSIX系统。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.