C中printf()的大字段宽度

时间:2013-07-29 12:21:00

标签: c printf c99 language-lawyer c11

C标准是否为下面的程序提供了任何借口,不会在其标准输出上产生千兆字节的空间?

#include <stdio.h>

int main()
{
  // 2^64 = 18446744073709551616
  printf("x%18446744073709551619dx\n", 42);
  return 0;
}

在Mac OS X 10.8和Linux上测试,我得到x 42x

C11标准说(7.21.6.1:4):“可选的最小字段宽度。如果转换后的值的字符数少于字段宽度,则在字段宽度上用左侧(或右侧,如果左侧调整标志,稍后描述)填充空格(默认情况下)。字段宽度采用星号*(稍后描述)或非负十进制整数的形式。“

C99中的措辞是一样的。

当字段宽度为*时,相应的参数将作为int(7.12.6.1:5)获得。但似乎并没有说硬编码的字段宽度应该适合int

2 个答案:

答案 0 :(得分:2)

虽然它没有解决字段宽度编码限制的具体问题,但请注意§7.21.6.1/ 15指出“任何单次转换可以产生的字符数至少应为4095。”因此,即使实现正确解析2 ^ 64 + 3,它也符合输出4094空格而不是“千兆字节”。

答案 1 :(得分:1)

虽然C标准没有定义最大值,但我猜每个编译器都有一个最大值。

这是一个类似的问题: size limit of printf conversion specification