题
printf
转换规格是 %
然后是标志,宽度,精度,长度修饰符和转换说明符。转换规范的大小是否有实际限制?
IE %s
长2个字符,而 %08.2f
长6个字符。我的问题是,根据C99标准,可以创建的格式字符串中最大单个规范的长度是多少?
解决方案
最大长度没有这样的转换规范。如果您认为自己找到了这样的规格,我可以想出一个更长的炭。
例如,考虑场宽度和精度。该标准表示它们是十进制整数,但没有指定其范围。因此,您可以编写以任意大整数为字段宽度或精度的转换说明符。
其他提示
如果您的意思是字符串,那是4095个字符
5.2.4.1翻译限制
...
- 字符串字符串字符串或宽字符串字面的4095个字符(串联之后)
...
我被509个字符的C89限制咬伤(不适合printf/scanf格式字符串),所以这是C99带来的良好更改之一:-)
编辑:GLIBC实施(不是标准定义)
GLIBC实现从一个 read_int
功能。
所以, 对于此实施,显然也许, ,限制为int_max(我没有搜索 read_int
功能).
printf转换规范之后是标志,宽度,精度,长度修饰符和转换规范符。转换规范的大小是否有实际限制?
我必须处理过去的几个标准 printf
实施和我的总体印象是没有特别的限制。
格式字符串通常是按字符解析的。 (简单地考虑 FSM。) 最多 printf
实现避免在内部缓冲任何东西,甚至用于数字,使用炭转换为十进制(甚至都不是) atoi
).
您可以检查例如 printf
在内部实现 FreeBSD内核 (从许多其他实施中,通常会提出代码)。这肯定是简化的实现(具有对核特定的调整),但它反映了格式字符串通常如何处理。
NB刚刚检查了GLIBC的 vfprintf()
实施,他们内部分配缓冲区(如果需要) malloc()
. 。因此,那里都没有特殊的限制。
我的问题是,根据C99标准,可以创建的格式字符串中最大单个规范的长度是多少?
据我所知,格式指定符是字符串长度的一部分,不受标准的限制。正如我上面提到的那样,我都没有看到过任何这样的限制的实现。