2011-03-09 2 views
3

C++은 대부분의 프로젝트에서 유용하지만 때로는 기존 C 스타일 함수와 통합해야합니다.C 기반 구조에서 C++ 통합

어떻게하면 깔끔한 방법으로, 특히 문자열로 작업하는 경우 어떻게 할 수 있습니까?

은 내가 이런 식으로 구성 사용할 수 있습니다 생각했다 :

std::string buffer; 
buffer.resize(1024); 

GetBackCStyleString(&buffer[0], 1024); 

을하지만 크기가 조정 된 길이를 반환으로이 문자열의 길이가 문제가 발생합니다. C++ 코드에서 C 함수를 통합하는 더 좋은 방법이 있습니까?

답변

1

좋은 해결책입니다. 크기를 정확하게하려면 함수가 반환 된 후 resize으로 다시 전화하면 실제 길이를 계산할 수 있습니다.

buffer.resize(GetBackCStyleString(&buffer[0], buffer.size()); 
기능이 길이를 반환하는 경우

, 또는 다른

GetBackCStyleString(&buffer[0], buffer.size() 
buffer.resize(strlen(&buffer[0])); 

.

0

buffer.c_str() 기능이 char* 인 경우 기능이 const char* 또는 const_cast<char*>(buffer.c_str()) 인 경우 수행합니다. 후자의 경우에는 신중해야합니다.

+0

@BenVoigt : 그리고 몇 가지 표준 버그로 인해 C++ 03에서 간접적으로 보장됩니다. :) –

+0

또한,'& buffer [0]'은 const-correctness를 보존하고'const_cast (buffer.c_str())'는 유지하지 않습니다. –

+1

@ 토말 렉, 당신의 코멘트를 설명해 주시겠습니까? C++ 03은 쓰기 가능한 문자열 버퍼를 간접적으로 어떻게 보장합니까? –

0

일반 char somebuf[somesize]; 버퍼를 만들고 C 함수에 쓰기를 허용합니다. 그런 다음 std::string buffer(somebuf)을 사용하여 std::string을 만듭니다.

이 함수가 단지 const char * (즉, "입력"매개 변수) 만 원할 경우 yourStdString.c_str()을 전달하면됩니다.

+3

여분의 불필요한 사본 –