2012-02-03 11 views
1

unsigned long을 쉼표를 끝에 추가하여 문자열로 변환하려고합니다.unsigned long의 snprintf에 쉼표를 추가합니다.

"1234," "1234" 
"1234" 

테스트 코드는 다음과 같습니다 : 컴파일하고 아래 찾을 수있는 테스트 코드를 실행할 때, 나는 다음과 같은 출력을 얻을

#include <cstdio> 
#include <iostream> 

int main() { 

    unsigned long c = 1234; 
    char ch[50]; 
    char ch1[50]; 

    sprintf(ch, "%lu,", c); 
    std::cout << "\"" << ch << "\"" << " \"" << c << "\"" << std::endl; 

    snprintf(ch1, 5, "%s", ch); 
    std::cout << "\"" << ch1 << "\"" << std::endl; 

    return 1; 
} 

지금까지 내가 이해, ch의 길이는 5이어야한다 , 쉼표에 4 자리수 + 1.

종료 문자에 대해 하나 더 부족하나요?

건배!

답변

3

snprintf으로 전달되는 크기에는 종료 널 문자가 포함됩니다. 인쇄되지는 않지만 여전히 버퍼에서 공간이 필요합니다.

대신 strlen(ch) + 1을 전달해야합니다. 버퍼를 채우기 전에 전체 결과를 수용하려는 경우에만 sizeof(ch1)이면 충분합니다.

대상 버퍼가 항상 snprintf에 전달하는 크기와 같거나 큰 충분한 크기인지 확인하십시오. 당신의 특별한 경우에는 거의 일어날 수 없지만, 일반적으로 당신은 그것을 염두에 두어야합니다. Linux manual page에서

1

:

The functions snprintf() and vsnprintf() write at most size bytes (including the trailing null byte ('\0')) to str.

는 그래서 그래, 당신은뿐만 아니라 쉼표를 얻을 수 (6)의 길이를 가져야한다.

0

작성한대로 종료 문자를위한 추가 공간을 놓친 것입니다.

The functions snprintf() and vsnprintf() write at most size bytes (including the terminating null byte ('\0')) to str.

1

는 C++ 방법 :

#include <string> 

unsigned long int c = 1234; 

std::string s = "\"" + std::to_string(c) + ",\""; 
std::string t = '"' + std::to_string(c) + ',' + '"'; // alternative 
+0

컴파일 중 오류 : 'to_string'이 (가) 'std'의 멤버가 아닙니다. – ezdazuzena

+1

@ezdazuzena : 최신 컴파일러 (C++ 11 지원)가 필요합니다. GCC에서'-std = C++ 0x'라고 말하십시오; MSVC10은 내가 아는 한 이것을 지원합니다. –

+0

힌트를 보내 주셔서 감사합니다. 질문이 snprintf와 관련되어 있었기 때문에 나는 다른 답을 옳은 것으로 표시했다. 뭐든지, 너 한테 고마워! – ezdazuzena

0

으로 여러 사람이 지적, 당신은 null 종결을위한 충분한 공간을 포함해야합니다.

snprintf에서 반환 된 결과를 확인하는 것이 좋습니다.

마지막으로, 나는 현재 snprintf에게 (등 버퍼를 sizeof (버퍼), 등)

를 사용하는 것이 좋습니다 것입니다 귀하의 두 번째 매개 변수는했습니다 실제 공간보다 크게 발생하는 경우 당황 결과를 얻을 가능성이 적습니다 있어.

관련 문제