6

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

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

4

3 回答 3

2

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

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

于 2010-10-20T12:54:55.977 回答
1

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

过去我不得不处理几个标准printf实现,我的总体印象是没有施加特别的限制。

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

例如,您可以检查它是如何在printfFreeBSD内核中实现的(许多其他实现通常会从那里提取代码)。这肯定是简化的实现(通过几个内核特定的调整),但它反映了格式字符串通常是如何处理的。

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

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

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

于 2010-10-20T15:33:02.237 回答
1

如果您的意思是文字字符串,则为 4095 个字符

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

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


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

read_intglibc 实现从函数中获取宽度。
所以,对于这个实现,显然,也许限制是 INT_MAX (我没有搜索过这个read_int函数)。

于 2010-10-20T13:20:09.847 回答