printf转换规范的大小限制
printf
转换规范是%
后跟标志,宽度,精度,长度修改器和转换说明符。 转换规范的大小是否有实际限制?
即%s
是2个字符长,而%08.2f
是6个字符长。 我的问题是,根据C99标准,可以创建的格式字符串中的最大单一规范的长度是多少?
没有最大长度的转换规范。 如果你认为你已经找到了这样一个规范,我可以想出一个更长的一个字符。
例如,考虑字段宽度和精度。 标准说它们是十进制整数但没有指定它们的范围。 因此,您可以将具有任意大整数的转换说明符编写为字段宽度或精度。
如果你的意思是一个文字字符串,它是4095个字符
5.2.4.1翻译限制
…
– 字符串文字或宽字符串文字中的4095个字符(连接后)
…
我被C89限制509个字符(不是printf / scanf格式字符串)所咬,所以这是C99带来的一个很好的改变:-)
编辑:glibc实现( 不是标准定义 )
glibc实现从read_int
函数获取宽度。
所以, 对于这个实现,显然,可能是限制是INT_MAX( 我没有搜索read_int
函数 )。
printf转换规范是%后跟标志,宽度,精度,长度修改器和转换说明符。 转换规范的大小是否有实际限制?
我不得不在过去处理几个标准的printf
实现和我的总体印象,即没有特别限制。
格式字符串通常逐个字符地解析。 (想想简单的FSM 。)大多数printf
实现都避免在内部缓冲任何东西,甚至对于数字使用char by char转换为decimal(甚至atoi
)。
您可以检查一下如何在FreeBSD内核中实现printf
(许多其他实现通常会解除代码)。 这肯定是简化了实现(通过几个特定于内核的调整),但它反映了格式字符串的处理方式。
NB刚刚检查了glibc的vfprintf()
实现,他们在内部使用malloc()
分配缓冲区(如果需要malloc()
。 所以没有特别的限制。
我的问题是,根据C99标准,可以创建的格式字符串中的最大单一规范的长度是多少?
格式说明符是字符串的一部分,据我所知,字符串长度不受标准的限制。 正如我在上面提到的那样,我从未见过任何此类限制的实现。