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

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

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

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

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

显然是这样的:

 printf("%s", pcReallyLongString); 

会是个问题。

非常感谢您的想法!

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

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

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

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