关于c ++:深度复制std :: string :: c_str()到char *

Deep copy std::string::c_str() to char *

本问题已经有最佳答案,请猛点这里访问。

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

1
char *cstr = string.c_str();

失败,因为c_str()是常量。


你可以这样做:

1
2
3
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);


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

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

请注意,通过值而不是引用传递s,从而尽可能减少获取字符串副本所需的工作量。

从理论上讲,直到C++ 03,这是不保证工作的(也就是说,字符串的缓冲区不保证是连续的)。事实上,这一保证对委员会来说相当容易增加,主要是因为没有人知道执行std::string会做其他事情。

同样,理论上,它可能会缺少nul终结者。如果您担心这种可能性,您可以使用return f(const_cast(s.c_str()));,或者在退货前添加s.push_back('\0');

1
2
3
4
ret_type f(std::string s) {
    s.push_back('\0');
    return f(&s[0]);
}


显而易见的解决方案是:

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

(不过,我更喜欢杰里·科芬的解决方案。)