2012-07-08 87 views
0
printf("%s%d%c", s, a, c); 

串將在標準輸出被打印;但是實現知道如何定義char數組的大小來保存結果呢?C如何知道printf的輸出字符串大小?

或者,另一種方法是:使用固定大小的緩衝器,處理每個變量參數格式字符串後面,如果解釋字符串大小超過緩衝區的大小,然後將其輸出到輸出流。這是真的?我想,C++中的字符串類型,其實現使用堆內存,動態內存分配器,就像newdelete,這是正確的嗎?

+4

有很多開源實現各地。爲什麼不去看一個呢? – 2012-07-08 17:06:29

+5

你爲什麼認爲必須有一個「char數組來保存結果」? – 2012-07-08 17:07:05

+1

也許沒有,和printf只是陸續寫一個字節diectly文件描述符1 ... – 2012-07-08 17:08:43

回答

4

的字符串將在標準輸出

這是正確的打印。這是一個,不需要char []。只有sprintf()需要猜測字符串緩衝區大小。

+4

由於'sprintf'沒有考慮到緩衝區本身,所以最後一句話*有點誤導。 *調用者*需要知道緩衝區有多大。當然他們從來不會這樣做,他們只是使用固定大小的緩衝區。 :p – 2012-07-08 17:11:22

+0

感謝您的回答。所以我是正確的關於c + +字符串的實現,該字符串被實現爲堆分配內存通過新/刪除? – bluesea 2012-07-08 17:14:07

+0

std :: string類是一個庫實現細節,每個編譯器都有自己的庫。礦井不會開始使用堆,直到字符串變得足夠大。否則這與printf()無關,也許你應該詢問另一個關於它的問題。 – 2012-07-08 17:33:34

0

但執行是如何知道界定持有什麼尺寸的字符數組 結果

只是讀取多達空終止字節'\0'。沒有必要明確地知道這是傳過來的char *

1

正如其他人所解釋的​​的大小,printf並不需要知道一些輸出緩衝區的大小提前時間,因爲它並不需要在寫入FILE*流時分配一個。

但是,你可能會懷疑:那麼printf中的函數不會寫入FILE*流呢?比如說,返回分配字符串的非標準asprintf函數呢?

printf家庭的功能可以做幹運行底層的實現。也就是說,它可以模擬做的操作,而不實際寫入內存和跟蹤,這將有書面char S上的號碼。一旦計算出該數字,它就可以分配一個合適大小的緩衝區並重復實際操作。這是調用者在需要自行分配緩衝區時會執行的操作,例如當調用snprintf時。

(你也談過緩衝I/O,雖然printf可以使用,但printf不一定知道緩衝本身(它可能不應該)),你可以認爲它調用fputc一堆次,然後寫入char到一定的緩衝,沖洗它,如果它的全部。)