如何将std::string转换为const char*或char*?

如何将std::string转换为char*const char*

解决办法

如果你只是想把一个std::string传给一个需要const char*的函数,你可以使用

std::string str;
const char * c = str.c_str();

如果你想得到一个可写的副本,像char *,你可以用这个来做。

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"。有两个直接的方法来解决这个问题。

boost::scoped_array

boost::scoped_array会在超出范围时为你删除内存。

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::vector

这是标准的方法(不需要任何外部库)。你使用[std::vector](http://en.cppreference.com/w/cpp/container/vector),它完全为你管理内存

std::string str;
std::vector writable(str.begin(), str.end());
writable.push_back('\0');

// get the char* using &writable[0] or &*writable.begin()
评论(33)

鉴于说...

std::string x = "hello";

从 "字符串 "中获取一个 "字符*"或 "const char*"

**如何获得一个有效的字符指针,同时`x`仍在范围内并且没有被进一步修改**。 **C++11**简化了事情;下面这些都可以访问同一个内部字符串缓冲区。
const char* p_c_str = x.c_str();
const char* p_data  = x.data();
char* p_writable_data = x.data(); // for non-const x from C++17 
const char* p_x0    = &x[0];

      char* p_x0_rw = &x[0];  // compiles iff x is not const...

所有上述指针将持有相同的值--缓冲区中第一个字符的地址。 即使是空字符串也有一个"缓冲区中的第一个字符",因为C++11保证在明确分配的字符串内容之后总是保留一个额外的NUL/0结束符(例如,std::string("this\0that", 9)将有一个缓冲区容纳"this\0that\0")。 给出上述任何一个指针。


char c = p[n];   // valid for n 
评论(1)

对 "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成员函数会重新分配内部缓冲区,并使你可能保存的任何指针无效。最好立即使用它们,然后丢弃。

评论(5)