3

目前我有一个复杂的函数,我自己和我们的团队不想重构以利用 std::string 并且它需要一个 char* 被修改。我如何正确地将 string::c_str() 的深拷贝制作成 char*?我不想修改字符串内部存储的 char*。

char *cstr = string.c_str();

失败,因为 c_str() 是 const。

4

3 回答 3

8

你可以这样做:

const std::string::size_type size = string.size();
char *buffer = new char[size + 1];   //we need extra char for NUL
memcpy(buffer, string.c_str(), size + 1);
于 2013-08-28T15:21:01.690 回答
4

与其修改现有函数,不如创建一个充当包装器的重载。假设现有的功能是ret_type f(char *),我会写这样的重载:

ret_type f(std::string s) { 
    return f(&s[0]);
}

注意通过s值而不是引用传递,最大限度地减少获取字符串副本所花费的精力。

理论上,这不能保证在 C++03 之前有效(即,不能保证字符串的缓冲区是连续的)。实际上,该保证对委员会来说是相当容易添加的,主要是因为没有人知道它的实现std::string还有其他作用。

同样,理论上它可能缺少 NUL 终止符。如果您担心这种可能性,您可以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]);
}
于 2013-08-28T15:22:32.280 回答
1

显而易见的解决方案是:

std::vector<char> tmp( string.begin(), string.end() );
tmp.push_back( '\0' );
function( &tmp[0] );

(不过,我更喜欢 Jerry Coffin 的解决方案。)

于 2013-08-28T15:56:45.193 回答