std::string str;
char * writable = new char[str.size() + 1];
std::copy(str.begin(), str.end(), writable);
writable[str.size()] = '\0'; // don't forget the terminating 0
// don't forget to free the string after finished using it
delete[] writable;
编辑。请注意,上面的做法并不安全。如果在 "new "调用和 "delete "调用之间有任何东西被抛出,你就会泄露内存,因为没有任何东西会自动调用 "delete"。有两个直接的方法来解决这个问题。
std::string str;
boost::scoped_array writable(new char[str.size() + 1]);
std::copy(str.begin(), str.end(), writable.get());
writable[str.size()] = '\0'; // don't forget the terminating 0
// get the char* using writable.get()
// memory is automatically freed if the smart pointer goes
// out of scope
如果你只是想把一个
std::string
传给一个需要const char*
的函数,你可以使用如果你想得到一个可写的副本,像
char *
,你可以用这个来做。编辑。请注意,上面的做法并不安全。如果在 "new "调用和 "delete "调用之间有任何东西被抛出,你就会泄露内存,因为没有任何东西会自动调用 "delete"。有两个直接的方法来解决这个问题。
boost::scoped_array
boost::scoped_array
会在超出范围时为你删除内存。std::vector
这是标准的方法(不需要任何外部库)。你使用[
std::vector
](http://en.cppreference.com/w/cpp/container/vector),它完全为你管理内存。鉴于说...
从 "字符串 "中获取一个 "字符*"或 "const char*"
**如何获得一个有效的字符指针,同时`x`仍在范围内并且没有被进一步修改**。 **C++11**简化了事情;下面这些都可以访问同一个内部字符串缓冲区。所有上述指针将持有相同的值--缓冲区中第一个字符的地址。 即使是空字符串也有一个"缓冲区中的第一个字符",因为C++11保证在明确分配的字符串内容之后总是保留一个额外的NUL/0结束符(例如,
std::string("this\0that", 9)
将有一个缓冲区容纳"this\0that\0"
)。 给出上述任何一个指针。对 "const char *"使用
.c_str()
方法。你可以使用
&mystring[0]
来获得一个char *
指针,但有几个问题:你不一定会得到一个零结尾的字符串,而且你不能改变字符串的大小。你尤其要注意不要在字符串的末尾添加字符,否则你会得到一个缓冲区超限(并可能崩溃)。在C++11之前,不能保证所有的字符都属于同一个连续的缓冲区,但实际上所有已知的
std::string
的实现都是这样工作的;见[Does "&s[0]" point to contiguous characters in a std::string?](https://stackoverflow.com/questions/1986966/does-s0-point-to-contiguous-characters-in-a-stdstring)。请注意,许多
string
成员函数会重新分配内部缓冲区,并使你可能保存的任何指针无效。最好立即使用它们,然后丢弃。