为格式说明符传递的printf参数太少 - 是不确定的行为?

时间:2016-08-08 15:37:14

标签: c printf posix

据我所知,参数的格式说明符太少被认为是未定义的行为(格式说明符的参数太少也是未定义的行为)。这适用于:

printf("%1$d %1$d", 5);

PS 使用"%1$d"格式说明符为an extension to the printf family of functions added by POSIX

2 个答案:

答案 0 :(得分:6)

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系统。

答案 1 :(得分:3)

这在POSIX中有效,其中包含:

  

在包含"%n $"的格式字符串中转换形式   规范,参数列表中的编号参数可以   根据需要从格式字符串中引用多次。

(强调我的)

%n$格式说明符存在约束,但与问题无关。请参阅链接的POSIX手册。

但是strict reading的C标准似乎说这是 undefined