Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为格式说明符向printf传递的参数太少-这是未定义的行为吗?_C_Printf_Posix - Fatal编程技术网

C 为格式说明符向printf传递的参数太少-这是未定义的行为吗?

C 为格式说明符向printf传递的参数太少-这是未定义的行为吗?,c,printf,posix,C,Printf,Posix,正如我所知,参数的格式说明符太少被认为是未定义的行为,而格式说明符的参数太少也是未定义的行为。这是否适用于: printf("%1$d %1$d", 5); PS使用%1$d作为格式说明符是有效的。这在中有效,表示: 格式字符串中包含%n$格式的转换 规范中,参数列表中的编号参数可以是 根据需要多次引用格式字符串 重点矿山 %n$格式说明符有限制,但与问题无关。请参阅链接的POSIX手册 但是C标准的a似乎表示这是未定义的。n$符号不是标准C的一部分,而是POSIX的一部分。的POSIX规范支

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

printf("%1$d %1$d", 5);
PS使用%1$d作为格式说明符是有效的。

这在中有效,表示:

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

重点矿山

%n$格式说明符有限制,但与问题无关。请参阅链接的POSIX手册

但是C标准的a似乎表示这是未定义的。

n$符号不是标准C的一部分,而是POSIX的一部分。的POSIX规范支持引用参数的n$符号

转换可以应用于参数列表中格式之后的第n个参数,而不是下一个未使用的参数。在本例中,转换说明符字符%see(见下文)被序列%n$替换,其中n是[1,{NL_ARGMAX}范围内的十进制整数,给出了参数在参数列表中的位置。此功能提供了格式字符串的定义,这些字符串按适合于特定语言的顺序选择参数。请参见“示例”部分

格式可以包含编号参数转换规范,%n$和*m$,也可以包含编号参数转换规范,%n$和*,但不能同时包含两者。唯一的例外是%%可以与%n$表单混合。在格式字符串中混合编号和未编号参数规范的结果未定义。使用编号参数规范时,指定第N个参数需要以格式字符串指定从第一个到第N-1个的所有前导参数

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

它要求您为每个n$提供一个参数,并且格式字符串引用每个参数1..n。它并不是说你每次都必须使用不同的n$


显示的代码在POSIX系统上很好。由于它只使用POSIX功能,因此无法移植到没有必要的扩展支持的非POSIX系统。

格式说明符。这些是格式说明符。所以是的。为什么它不适用@SouravGhosh这是一个POSIX的东西:但这是一个非iso-C格式的说明符,因此,由于这是一个语言律师的问题,我们可能想指定我们实际上谈论的是哪个版本的C…如果你问,因为你使用的是扩展说明符,不知道这是否会影响关于这是否是UB的答案,然后在问题中这样说。上下文是关键。有一个合理的提问理由会减少对问题的负面反应。也就是说,我很确定这同样是UB,因为为什么POSIX会不遗余力地使其格式良好?不,我不知道数百种不同的C实现的规律。结论是代码很好,但不可移植。对吗?它可以移植到符合POSIX标准的系统上。它不能移植到POSIX不兼容的系统,这在您使用POSIX特定功能时并不奇怪。请再说一件事:在格式字符串中混合编号和未编号参数规范的结果是未定义的,这是否意味着相同格式字符串中的%*d%nd更多或更少未定义。使用printf%d%2$d\n,1,2混合了未编号和已编号的符号,结果未定义。你得到你得到的。不管序列是未编号的还是未编号的,任何混合物都是未定义的。printf%*2$s\n,未定义,7;例如,是未定义的行为。但是,请注意,根据C,该行为未定义的原因不是参数太少,而是如果转换规范无效,则该行为未定义。C将格式字符串中的“%”字符指定为转换规范的开头,但OP示例中指示的转换规范就ISO C 2011而言无效。确实如此。我链接的帖子很清楚地解释了这一点。