If you just want to pass a
std::string to a function that needs
const char* you can use
std::string str; const char * 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 = 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;
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<char> 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
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<char> writable(str.begin(), str.end()); writable.push_back('\0'); // get the char* using &writable or &*writable.begin()