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