开发者

How to convert std::string to const char*? [duplicate]

This question a开发者_开发百科lready has answers here: Closed 10 years ago.

Possible Duplicate:

Convert std::string to const char* or char*

void Foo::bar(const std::string& foobar) {
    // ...
    const char* foobar2 = (char*)foobar;
    // ...
}

That does not work and I get an error during compilation about invalid casting.

Is there some other way to convert std::string to const char*?


Use foobar.c_str().

You might find this link useful: http://www.cppreference.com/wiki/string/start


std::string::c_str() gets you a const char* pointer to a character array that represents the string (null-terminated).

You should not manipulate the data this pointer points to, so if you need to do that, copy the data.

Double edit - doing it in a more C++ fashion

Since it is nicer to avoid the use of raw pointers and arrays where possible, you can also get the data into an std::vector<char>

#include <string>
#include <vector>

int main()
{
    std::string str = "Hello";
    std::vector<char> cvec(str.begin(), str.end()); 

    // do stuff
}

edit this is more like C since it uses raw pointers and explicitly allocates mem

#include <string>
#include <cstring>

int main()
{
    std::string str = "Hello";
    char *cptr = new char[str.size()+1]; // +1 to account for \0 byte
    std::strncpy(cptr, str.c_str(), str.size());

    // do stuff...
    delete [] cptr;
}


You're going to get a lot of kinda incorrect answers about str.c_str() here. :) While c_str() is indeed useful, please keep in mind that this will not actually convert the string into a char*, but rather return the contents of the string as a const char*. And this is a big difference!

What's important here is that the pointer you obtain from c_str() is valid only as long as the given string object exists. So this would be terribly wrong:

class Something {
    const char* name;
public:
    Something(const std::string& pname) {
        this->name = pname.c_str(); /* wrong! the pointer will go wrong as the object from the parameter ceases to exist */
    }
};

So if you want to convert, as in: create a new value which will be independent of the original std::string, then you'll want to do something like this:

char* convert(const std::string& str) {
    char* result = new char[str.length()+1];
    strcpy(result,str.c_str());
    return result;
}

But still c_str() will be quite enough for you in most cases. Just try to think in terms of objects' time of life.


const char* foobar2 = foobar.c_str();

Notice the const. Otherwise you have to copy it to a char buffer.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜