将std :: string :: c_str()深层复制到char *

时间:2013-08-28 15:15:39

标签: c++ string

目前我有一个复杂的功能,我和我们的团队不想重构使用std :: string,它需要修改一个char *。我如何正确地将string :: c_str()的深层复制到char *中?我希望修改字符串内部存储的char *。

char *cstr = string.c_str();

失败,因为c_str()是const。

3 个答案:

答案 0 :(得分:7)

你可以这样做:

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);

答案 1 :(得分: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]);
}

答案 2 :(得分:1)

显而易见的解决方案是:

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

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