2011-09-21 7 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? 

감사합니다. 현재 snprintf 문자열의 \ 0 터미네이터위한 공간을 필요로하기 때문에

답변

28

될 것입니다. 따라서 버퍼가 1 바이트 길이라고 말하면 '2'를위한 공간이 없습니다.

1 바이트로 snprintf(charArrayAgain, 2, "%d", number);

+1

'2 '대신'sizeof (charArrayAgain)'을 사용하십시오. – indiv

+6

에 동의하지만, sizeof (charArrayAgain)는 더 좋을 것입니다. 배열보다는 포인터를 사용하기는하지만 sizeof()가 작동하지 않을 경우가 있습니다. –

2

확인 현재 snprintf의 반환 값은() 아마 2

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

당신은 당신의 최대 버퍼 크기를 지정하고 함께보십시오. 그러나, 문자열에서 한 자리를 저장하기 위해, 당신은 (숫자 하나, 및 null 종결을위한 하나를.) 바이트가 있어야합니다 당신은 배열에 하나의 문자를 인쇄에만 snprintf 말 했어요

4

이는 문자열 변환 된 숫자 (즉 하나의 문자)와 두 번째 문자 인 문자열 종결 자 \ 0을 보유하기에 충분하지 않으므로 snprintf가 지정한 문자열에 문자열을 저장할 수 없습니다.

4

snprintf의 두 번째 인수는 배열에 쓸 최대 바이트 수입니다 (charArrayAgain). 여기에는 종료 '\0'이 포함되므로 크기가 1이면 빈 문자열을 쓰지 않습니다.