2012-07-06 28 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