printf转换规范的大小限制

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

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

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

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

如果你的意思是一个文字字符串,它是4095个字符

5.2.4.1翻译限制

– 字符串文字或宽字符串文字中的4095个字符(连接后)

我被C89限制509个字符(不是printf / scanf格式字符串)所咬,所以这是C99带来的一个很好的改变:-)


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

glibc实现从read_int函数获取宽度。
所以, 对于这个实现,显然,可能是限制是INT_MAX( 我没有搜索read_int函数 )。

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

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

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

您可以检查一下如何在FreeBSD内核中实现printf (许多其他实现通常会解除代码)。 这肯定是简化了实现(通过几个特定于内核的调整),但它反映了格式字符串的处理方式。

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

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

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