기존 기능을 수정하기보다는, 그냥 래퍼 역할을하는 오버로드를 만들 것입니다. 기존의 기능을 가정하면 내가 좋아하는 과부하 뭔가를 써서, ret_type f(char *)
입니다 :
ret_type f(std::string s) {
return f(&s[0]);
}
참고 문자열의 복사본을 얻기 위해 소요 된 노력을 최소화하는 대신 참조 값으로 s
을 전달합니다.
이론적으로 C++ 03까지는 이론상 작동이 보장되지 않습니다 (즉, 문자열의 버퍼가 연속적이라는 보장은 없습니다). 실제로 다른 사람이 수행 한 std::string
구현을 아는 사람이 아무도 없었기 때문에이 보증은위원회가 추가하기가 상당히 쉬웠습니다.
마찬가지로 이론적으로 NUL 터미네이터가 누락 될 수 있습니다. 그러나,
std::vector<char> tmp(string.begin(), string.end());
tmp.push_back('\0');
function(&tmp[0]);
(I 오히려 같은 제리 관의 솔루션 : 그 가능성에 대해 우려된다면 대신 return f(const_cast<char *>(s.c_str()));
을 사용하거나 반환하기 전에 s.push_back('\0');
을 추가 할 수 있습니다
ret_type f(std::string s) {
s.push_back('\0');
return f(&s[0]);
}
이 C++ 11입니까? 'std :: string'을 복사하고'& stringCopy [0]'을 사용하십시오. – chris
'strdup','new/strcpy', @chris '제안, ... 선택의 여지가 있습니다. – syam
sprintf (cstr, "% s", somestring.c_str()) – bartimar