void Foo::bar(const std::string& foobar) {
// ...
const char* foobar2 = (char*)foobar;
// ...
}
这不起作用,我在编译期间遇到有关无效转换的错误。
还有其他方法可以将std::string
转换为const char*
吗?
答案 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缓冲区。