2011-09-21 64 views
11

有人可以給我解釋一下這個簡單程序的輸出:的snprintf和sprintf解釋

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char charArray[1024] = ""; 
    char charArrayAgain[1024] = ""; 
    int number; 

    number = 2; 

    sprintf(charArray, "%d", number); 

    printf("charArray : %s\n", charArray); 

    snprintf(charArrayAgain, 1, "%d", number); 
    printf("charArrayAgain : %s\n", charArrayAgain); 

    return 0; 
} 

,輸出是:

./a.out 
charArray : 2 
charArrayAgain : // Why i don't have 2 here? 

感謝。

回答

28

因爲snprintf的需求空間,爲\ 0終止的字符串。所以如果你告訴它緩衝區長度爲1個字節,那麼'2'就沒有空間了。

snprintf(charArrayAgain, 2, "%d", number);

+1

怎麼樣,而不是'2',你'sizeof(charArrayAgain)'。 – indiv

+6

同意,sizeof(charArrayAgain)會更好 - 雖然通常你有一個指針而不是一個數組,在這種情況下sizeof()不會工作。 –

2

檢查從snprintf的返回值(),它可能會是2

4
snprintf(charArrayAgain, 1, "%d", number); 
//      ^

您指定的是最大緩衝區大小嚐試是一個字節。然而,存儲在字符串中的一個數字,你必須有字節(一個數字,一個用於空終止符。)

4

你告訴snprintf僅打印單個字符到數組,它不足以保存字符串轉換的數字(即一個字符)和字符串終止符\ 0(它是第二個字符),因此snprintf無法將字符串存儲到您給出的緩衝區中。

4

snprintf的第二個參數是要寫入數組的最大字節數(charArrayAgain)。它包括終止'\0',所以大小爲1時不會寫入空字符串。