2012-07-06 90 views
1

我的理解是,printf的大多数实现依赖于像无限缓冲区的printf - 格式化看跌直接以流

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

实际处理的格式,然后他们通过放它们输出到流。

是否有同时保持打印所有字符串的能力,最大限度地减少_acBuffer的大小任意执行[0]要求?

显然是这样的:

printf("%s", pcReallyLongString); 

将是一个问题。

你的想法是非常感谢!

+5

你从哪里得到你的理解?根据我的经验,这似乎完全错误。 – abelenky 2012-07-06 18:12:26

+3

建议:尝试一下,看看哪里(或者,如果!)你最大程度的发挥'的printf( “%S”,pcReallyLongString);'PS: “的sizeof(_acBuffer [0])” 是没有意义的;) – paulsm4 2012-07-06 18:16:34

+0

大多从这里HTTP ://stackoverflow.com/questions/4867229/code-for-printf-function-in-c和我们的内部实现。 如果你能提供洞察我的误解,我将不胜感激。 – Pablitorun 2012-07-06 18:22:01

回答

4

你的理解是错误的。我从来没有见过或听说过一个printf实现,它首先将整个输出格式化为一个临时字符串缓冲区。通常的printf是周围的其他方法进行:基本构建块是vfprintfvsnprintf是一个包装它创建了一个假的FILE其缓冲区是目标字符串。

编辑:一些流行(例如glibc的)实现使一些使用无粘结-大中间缓冲器为特定格式,特别是宽字符转换的,并且当它们不能用于缓冲分配足够的存储器将不可预测地失败。然而,这纯粹是一个低质量的实施问题。没有任何根本原因,任何printf函数都应该只需要一小部分恒定的工作空间,而不管它们在打印什么。

2

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

除非我失去了一些东西,一个正确实施fprintf功能应该强加于得到的线有多长完全没有限制。通过vsnprintf的假设实施将违反该原则。

+0

每个'%'说明符都是一个转换。因此,该标准允许实现为每个转换使用固定大小的缓冲区,但不允许整个'printf'调用。 – 2012-07-06 22:27:26

+0

@R:你说得对。显然,意图是指由一个*单个格式说明符*执行的转换,而不是对'fprintf'的整个调用。编辑答案。 – AnT 2012-07-06 22:42:40