据我所知,参数的格式说明符太少被认为是未定义的行为(格式说明符的参数太少也是未定义的行为)。这适用于:
printf("%1$d %1$d", 5);
PS 使用"%1$d"
格式说明符为an extension to the printf
family of functions added by POSIX。
答案 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 。