2011-09-21 74 views
11

ai đó có thể giải thích cho tôi đầu ra của chương trình đơn giản này:snprintf và sprintf giải thích

#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; 
} 

Và kết quả là:

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

Cảm ơn.

Trả lời

28

Vì snprintf cần không gian cho \ 0 terminator của chuỗi. Vì vậy, nếu bạn nói nó đệm là 1 byte dài, sau đó không có không gian cho '2'.

Hãy thử với snprintf(charArrayAgain, 2, "%d", number);

+1

Thay vì '2', bạn làm' sizeof (charArrayAgain) '. – indiv

+6

đồng ý, sizeof (charArrayAgain) sẽ tốt hơn - mặc dù thường bạn có một con trỏ chứ không phải là một mảng, trong trường hợp đó sizeof() sẽ không hoạt động. –

2

Kiểm tra giá trị trả về từ snprintf() nó có thể sẽ được 2.

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

Bạn đang xác định kích thước bộ đệm tối đa của bạn là một byte. Tuy nhiên, để lưu trữ một chữ số duy nhất trong một chuỗi, bạn phải có hai byte (một cho chữ số và một cho dấu kết thúc null.)

4

Bạn đã nói snprintf để chỉ in một ký tự đơn lẻ vào mảng , đó là không đủ để giữ số chuỗi được chuyển đổi (đó là một ký tự) và chuỗi terminator \ 0, là ký tự thứ hai, vì vậy snprintf không thể lưu chuỗi vào bộ đệm mà bạn đã cho nó.

4

Đối số thứ hai cho snprintf là số byte tối đa được ghi vào mảng (charArrayAgain). Nó bao gồm các chấm dứt '\0', do đó, với kích thước của 1 nó sẽ không viết một chuỗi rỗng.