我的理解是printf的大多数实现依赖于
之类的东西vsnprintf( _acBuffer[0], sizeof( _acBuffer[0] ), pcFormat, *ptArgList );
实际处理格式,然后通过puts将它们输出到流。
是否有任何实现可以最小化_acBuffer [0]的大小,同时保持打印所有字符串的能力?
显然是这样的:
printf("%s", pcReallyLongString);
会有问题。
非常感谢您的想法!
答案 0 :(得分:4)
你的理解是错的。我从未见过或听说过printf
实现,它首先将整个输出格式化为临时字符串缓冲区。通常printf以相反的方式完成:基本构建块是vfprintf
而vsnprintf
是包装器,它创建了一个假的FILE
,其缓冲区是目标字符串。
编辑:一些流行的(例如glibc)实现执行对某些格式使用无限大的中间缓冲区,尤其是宽字符转换,并且会在不可预测的情况下失败他们无法为缓冲区分配足够的内存。然而,这纯粹是一个低质量的实施问题;任何printf
函数都不需要任何超过一小块恒定的工作空间,无论它们打印的是什么,都没有根本原因。
答案 1 :(得分:2)
我要说fprintf
(或printf
)规范的重点是允许这个函数的“无缓冲”一次通过实现的方式。即它逐个顺序地转换数据(如果它需要转换),立即将它发送到输出并忘记它是好的。该函数可以使用中间缓冲区进行数值数据转换,但这是一个固定且无关紧要的编译时大小的临时缓冲区。
除非我遗漏了某些内容,否则正确实现的fprintf
函数应该对结果字符串的长度绝对没有限制。通过vsnprintf
进行的假设实施将违反该原则。