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标准,可以创建的格式字符串中最大单个规范的长度是多少?

据我所知,格式指定符是字符串长度的一部分,不受标准的限制。正如我上面提到的那样,我都没有看到过任何这样的限制的实现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top