printf("%s%d%c", s, a, c);
串將在標準輸出被打印;但是實現知道如何定義char數組的大小來保存結果呢?C如何知道printf的輸出字符串大小?
或者,另一種方法是:使用固定大小的緩衝器,處理每個變量參數格式字符串後面,如果解釋字符串大小超過緩衝區的大小,然後將其輸出到輸出流。這是真的?我想,C++中的字符串類型,其實現使用堆內存,動態內存分配器,就像new
或delete
,這是正確的嗎?
printf("%s%d%c", s, a, c);
串將在標準輸出被打印;但是實現知道如何定義char數組的大小來保存結果呢?C如何知道printf的輸出字符串大小?
或者,另一種方法是:使用固定大小的緩衝器,處理每個變量參數格式字符串後面,如果解釋字符串大小超過緩衝區的大小,然後將其輸出到輸出流。這是真的?我想,C++中的字符串類型,其實現使用堆內存,動態內存分配器,就像new
或delete
,這是正確的嗎?
的字符串將在標準輸出
這是正確的打印。這是一個流,不需要char []。只有sprintf()需要猜測字符串緩衝區大小。
由於'sprintf'沒有考慮到緩衝區本身,所以最後一句話*有點誤導。 *調用者*需要知道緩衝區有多大。當然他們從來不會這樣做,他們只是使用固定大小的緩衝區。 :p – 2012-07-08 17:11:22
感謝您的回答。所以我是正確的關於c + +字符串的實現,該字符串被實現爲堆分配內存通過新/刪除? – bluesea 2012-07-08 17:14:07
std :: string類是一個庫實現細節,每個編譯器都有自己的庫。礦井不會開始使用堆,直到字符串變得足夠大。否則這與printf()無關,也許你應該詢問另一個關於它的問題。 – 2012-07-08 17:33:34
但執行是如何知道界定持有什麼尺寸的字符數組 結果
只是讀取多達空終止字節'\0'
。沒有必要明確地知道這是傳過來的char *
正如其他人所解釋的的大小,printf
並不需要知道一些輸出緩衝區的大小提前時間,因爲它並不需要在寫入FILE*
流時分配一個。
但是,你可能會懷疑:那麼printf
中的函數不會寫入FILE*
流呢?比如說,返回分配字符串的非標準asprintf
函數呢?
爲printf
家庭的功能可以做幹運行底層的實現。也就是說,它可以模擬做的操作,而不實際寫入內存和跟蹤,這將有書面char
S上的號碼。一旦計算出該數字,它就可以分配一個合適大小的緩衝區並重復實際操作。這是調用者在需要自行分配緩衝區時會執行的操作,例如當調用snprintf
時。
(你也談過緩衝I/O,雖然printf
可以使用,但printf
不一定知道緩衝本身(它可能不應該)),你可以認爲它調用fputc
一堆次,然後寫入char
到一定的緩衝,沖洗它,如果它的全部。)
有很多開源實現各地。爲什麼不去看一個呢? – 2012-07-08 17:06:29
你爲什麼認爲必須有一個「char數組來保存結果」? – 2012-07-08 17:07:05
也許沒有,和printf只是陸續寫一個字節diectly文件描述符1 ... – 2012-07-08 17:08:43