1

我的理解是 printf 的大多数实现都依赖于类似的东西

vsnprintf( _acBuffer[0], sizeof( _acBuffer[0] ), pcFormat, *ptArgList );

实际处理格式,然后他们通过 puts 将它们输出到流中。

是否有任何实现可以最小化所需的 _acBuffer[0] 大小,同时保持打印所有字符串的能力?

显然是这样的:

printf("%s", pcReallyLongString);

会是个问题。

非常感谢您的想法!

4

2 回答 2

4

你的理解是错误的。我从未见过或听说过printf首先将整个输出格式化为临时字符串缓冲区的实现。通常 printf 以相反的方式完成:基本构建块是vfprintf并且vsnprintf是一个包装器,它创建一个假FILE的,其缓冲区是目标字符串。

编辑:一些流行的(例如glibc)实现确实为某些格式使用了无限大的中间缓冲区,尤其是宽字符转换,并且当它们无法为缓冲区分配足够的内存时会意外失败。然而,这纯粹是一个低质量的实施问题;printf无论打印什么,任何功能都只需要少量恒定的工作空间,没有根本原因。

于 2012-07-06T21:09:30.950 回答
2

我想说fprintf(或printf)规范的重点是允许“无缓冲”一次性实现此功能的方式。即,它将数据逐个顺序转换(如果需要转换),立即将其发送到输出并永远忘记它。该函数可以使用中间缓冲区进行数字数据转换,但这是一个固定且编译时大小不重要的临时缓冲区。

除非我遗漏了什么,否则一个正确实现的fprintf函数应该对结果字符串的长度绝对没有限制。您假设的实现vsnprintf将违反该原则。

于 2012-07-06T21:56:30.423 回答