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

ron*_*ino 3 c printf posix

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

printf("%1$d %1$d", 5);
Run Code Online (Sandbox Code Playgroud)

PS使用"%1$d"as格式说明符是POSIX添加的函数族的扩展printf.

Jon*_*ler 6

n$符号不是标准C的一部分,但POSIX的一部分.POSIX规范printf()支持n$表示参数的表示法.

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

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

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

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

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

  • 或多或少.使用`printf("%d%2 $ d \n",1,2)`混合未编号和带编号的符号,结果未定义.你得到了你得到的.无论序列是无编号还是编号 - 无编号都无关紧要 - 任何混合都是未定义的.(`printf("%*2 $ s \n","undefined",7);`是未定义的行为,例如.) (2认同)