If you just want to pass a std::string
to a function that needs const char*
you can use
std::string str;constchar* c = str.c_str();
If you want to get a writable copy, like char *
, you can do that with this:
std::string str;char* writable =newchar[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 itdelete[] writable;
Edit: Notice that the above is not exception safe. If anything between the new
call and the delete
call throws, you will leak memory, as nothing will call delete
for you automatically. There are two immediate ways to solve this.
boost::scoped_array
will delete the memory for you upon going out of scope:
std::string str;
boost::scoped_array writable(newchar[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
This is the standard way (does not require any external library). You use std::vector
, which completely manages the memory for you.
std::string str;
std::vector writable(str.begin(), str.end());
writable.push_back(\'\\0\');// get the char* using &writable[0] or &*writable.begin()