printf转换规范的大小限制

时间:2010-10-20 12:36:48

标签: c printf c99 format-string

printf转换规范为%,后跟标志,宽度,精度,长度修饰符和转换说明符。转换规范的大小是否存在实际限制?

即。 %s长2个字符,而%08.2f长6个字符。我的问题是,根据C99标准,可以创建的格式字符串中的最大单一规范的长度是多少?

3 个答案:

答案 0 :(得分:2)

没有最大长度的转换规范。如果你认为你已经找到了这样一个规范,我可以想出一个更长的一个字符。

例如,考虑字段宽度和精度。标准说它们是十进制整数但没有指定它们的范围。因此,您可以将具有任意大整数的转换说明符编写为字段宽度或精度。

答案 1 :(得分:1)

如果你的意思是文字字符串,那就是4095个字符

  

5.2.4.1翻译限制
  ...
   - 字符串文字或宽字符串文字中的4095个字符(连接后)
  ...

我被C89限制509个字符(不适用于printf / scanf格式字符串)所咬,所以这是C99带来的一个很好的改变: - )


编辑:glibc实现(不是标准定义

glibc实现获取read_int函数的宽度。
所以,对于这个实现,显然可能是,限制是INT_MAX(我没有搜索read_int函数)。

答案 2 :(得分:1)

  

printf转换规范是%后跟标志,宽度,精度,长度修改器和转换说明符。转换规范的大小是否存在实际限制?

我不得不在过去处理几个标准printf实施,以及我的一般印象,即没有特别限制。

格式字符串通常逐个字符地解析。 (想想简单FSM。)大多数printf实现都避免在内部缓冲任何内容,即使数字使用char by char转换为十进制(甚至不是atoi)。

您可以检查printf如何在FreeBSD kernel内实现(许多其他实现通常会解除代码)。这肯定是简化了实现(通过几个特定于内核的调整),但它反映了格式字符串的处理方式。

N.B。刚刚检查了glibc的vfprintf()实现,他们在内部为malloc()分配了一个缓冲区(如果需要)。所以没有特别的限制。

  

我的问题是,根据C99标准,可以创建的格式字符串中最大单一规格的长度是多少?

格式说明符是字符串的一部分,据我所知,字符串长度不受标准限制。正如我在上面提到的那样,我从未见过任何此类限制的实现。