2013-04-29 120 views
5

我想知道是否有更好的方法在c中打印整數的數組;同時打印多個整數

目前我爲我的數組中的每個int做一個printf("%d" ,..)

但是,這會導致一個系統調用每個int? (如果我的理解是正確的)。

將int數組轉換爲字符串緩衝區然後在一次調用中打印緩衝區會更好。

如有必要,我可以爲它編寫代碼。

Q1。這是一個好主意還是太麻煩值得呢? Q2302。是否有任何圖書館實施這樣的事情。 (無論我谷歌回來初學者教程打印整數:S)

編輯 數組的大小不是事先知道。

+0

的printf( 「%d%d%d%d \ n」,編曲[0],編曲[1],編曲[2])最多隻能寫一個write()調用 - 您擔心的系統調用。 – 2013-04-29 03:10:23

+0

@jimmcnamara數組是動態大小的..所以不能用這種方式對它進行硬編碼。我已經更新了這個問題。 – 2013-04-29 03:12:09

+0

您在詢問有關「多個」系統調用場景的問題。不是編程解決方法,IMO。 – 2013-04-29 03:13:29

回答

3

當您使用printf時,輸出已經被緩衝。系統調用僅在您刷新緩衝區時進行 - 明確地通過調用fflush(stdout)或隱式地將\n打印到控制檯。因此,應用程序端的預緩衝會使您的代碼更加複雜,而不會在性能上產生任何實際差異。

至於庫幫你寫int s到一個字符串的話,你可以使用你已經在使用相同<stdio.h>:分配足夠大的空間容納你的整數的緩衝區,使用sprintf代替printf寫它,然後調用printf與整個緩衝區的內容。如果您決定在輸出中使用它們作爲分隔符,這將幫助您避免在\n上進行刷新。

+0

謝謝。如果它被緩衝,那麼我想我可以使用printf。雖然sprintf是一個好主意。 – 2013-04-29 03:16:24

+0

@OsamaJaved sprintf唯一有用的情況是如果你想用'\ n'作爲分隔符,*和*你想寫入與控制檯相關的輸出流(文件輸出流不會被刷新'\ n'反正)。 – dasblinkenlight 2013-04-29 03:18:13

+0

您已經省略了未緩衝的流 - stdout可以無緩衝,就像stderr是默認的一樣。 – 2013-04-29 10:42:33

3

不,它不會導致一個系統調用每int,除非您將stdout設置爲無緩衝模式。這是stdio的重點:爲你緩衝輸出,所以你不必自己動手。對於printf函數本身,存在最小量的額外調用開銷。如果你發現自己需要更多的性能,你可以嘗試像:

for (i=0; i+4<=N; i+=4) 
    printf("%d %d %d %d ", a[i], a[i+1], a[i+2], a[i+3]); 
for (; i<N; i++) 
    printf("%d ", a[i]); 
+0

如果它的緩衝我不需要擔心,那麼:D。謝謝 – 2013-04-29 03:14:31