繁体   English   中英

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

[英]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系统。

这在POSIX中有效,它说:

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

(强调我的)

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

严格阅读 C标准似乎表明这是不确定的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM