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); |
与其修改现有的函数,不如创建一个充当包装器的重载。假设现有的函数是
1 2 3 | ret_type f(std::string s) { return f(&s[0]); } |
请注意,通过值而不是引用传递
从理论上讲,直到C++ 03,这是不保证工作的(也就是说,字符串的缓冲区不保证是连续的)。事实上,这一保证对委员会来说相当容易增加,主要是因为没有人知道执行
同样,理论上,它可能会缺少nul终结者。如果您担心这种可能性,您可以使用
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] ); |
(不过,我更喜欢杰里·科芬的解决方案。)