printf
的转换说明符是由标志、宽度、精度、长度修饰符和转换说明符组成的%
。是否存在转换说明符大小的实际限制?
例如,%s
的长度为2个字符,而%08.2f
的长度为6个字符。我的问题是,根据C99标准,可以创建的格式字符串中最大单个规范的长度是多少?
printf
的转换说明符是由标志、宽度、精度、长度修饰符和转换说明符组成的%
。是否存在转换说明符大小的实际限制?
例如,%s
的长度为2个字符,而%08.2f
的长度为6个字符。我的问题是,根据C99标准,可以创建的格式字符串中最大单个规范的长度是多少?
没有最大长度的转换规范。如果您认为找到了这样的规范,我可以提供一个比它多一个字符的规范。
例如,考虑字段宽度和精度。标准规定它们是十进制整数,但不指定它们的范围。因此,您可以编写具有任意大整数作为字段宽度或精度的转换说明符。
printf
可能不会(也没有必要)强制执行任何限制,但是由于 printf
返回打印的字符数,因此如果您使用非常大的字段宽度/精度,您将获得未指定/未定义(不清楚哪个)的行为。格式说明符可以具有无限长度的更现实的原因是冗余标志,例如 %+++++++++++++++++++++++d
。 - R.. GitHub STOP HELPING ICE如果你指的是一个字面字符串,它有4095个字符
5.2.4.1 翻译限制
...
-- 字符串字面值或宽字符串字面值中的4095个字符(在连接后)
...
我曾经被C89的509个字符限制所困扰(不适用于printf/scanf格式字符串),所以这是C99带来的好变化之一 :-)
编辑:glibc实现(非标准定义)
glibc实现从read_int
函数获取宽度。
因此,对于这个实现,显然,也许,限制是INT_MAX(我还没有搜索read_int
函数)。
snprintf
包装器,并想了解是否可以静态分配一些临时缓冲区。 - zaharpopov