目前我有一个复杂的功能,我和我们的团队不想重构使用std :: string,它需要修改一个char *。我如何正确地将string :: c_str()的深层复制到char *中?我不希望修改字符串内部存储的char *。
char *cstr = string.c_str();
失败,因为c_str()是const。
答案 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的解决方案。)