无限缓冲区printf - 格式化直接放入流

时间:2012-07-06 18:09:22

标签: c string printf

我的理解是printf的大多数实现依赖于

之类的东西
vsnprintf( _acBuffer[0], sizeof( _acBuffer[0] ), pcFormat, *ptArgList );

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

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

显然是这样的:

printf("%s", pcReallyLongString);

会有问题。

非常感谢您的想法!

2 个答案:

答案 0 :(得分:4)

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

编辑:一些流行的(例如glibc)实现执行对某些格式使用无限大的中间缓冲区,尤其是宽字符转换,并且会在不可预测的情况下失败他们无法为缓冲区分配足够的内存。然而,这纯粹是一个低质量的实施问题;任何printf函数都不需要任何超过一小块恒定的工作空间,无论它们打印的是什么,都没有根本原因。

答案 1 :(得分:2)

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

除非我遗漏了某些内容,否则正确实现的fprintf函数应该对结果字符串的长度绝对没有限制。通过vsnprintf进行的假设实施将违反该原则。