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

时间:2010-11-17 18:22:17

标签: c++

  

可能重复:
  Convert std::string to const char* or char*

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

这不起作用,我在编译期间遇到有关无效转换的错误。

还有其他方法可以将std::string转换为const char*吗?

4 个答案:

答案 0 :(得分:47)

使用foobar.c_str()

您可能会发现此链接很有用:http://www.cppreference.com/wiki/string/start

答案 1 :(得分:11)

std::string::c_str()获取一个const char*指针,指向表示字符串的字符数组(以null结尾)。

您不应该操纵此指针指向的数据,因此如果您需要这样做,请复制数据。

双重编辑 - 以更加C ++的方式进行编辑

由于避免在可能的情况下使用原始指针和数组更好,您也可以将数据转换为std::vector<char>

#include <string>
#include <vector>

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

    // do stuff
}

编辑这更像是C,因为它使用原始指针并显式分配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;
}

答案 2 :(得分:4)

在这里,你会得到很多关于str.c_str()有点不正确的答案。 :)虽然c_str()确实很有用,但请记住,这实际上并不会将字符串转换为char* ,而是返回字符串的内容作为const char* 这是一个很大的区别!

这里重要的是,只有给定的c_str()对象存在,从string获得的指针才有效。所以这将是非常错误

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 */
    }
};

因此,如果您想要转换,例如:创建一个独立于原始std::string 的新值,那么您将需要执行以下操作:

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

但在大多数情况下,c_str()对你来说仍然足够。试着用对象的生命时间来思考。

答案 3 :(得分:3)

const char* foobar2 = foobar.c_str();

注意 const 。 否则你必须将它复制到char缓冲区。