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