可能是重复问题:
如何将std::string转换为const char*或char*
void Foo::bar(const std::string& foobar) {
// ...
const char* foobar2 = (char*)foobar;
// ...
}
这种方法不起作用,并且我在编译过程中会得到一个关于无效类型转换的错误。
是否有其他方法将 std::string
转换为 const char*
?
可能是重复问题:
如何将std::string转换为const char*或char*
void Foo::bar(const std::string& foobar) {
// ...
const char* foobar2 = (char*)foobar;
// ...
}
这种方法不起作用,并且我在编译过程中会得到一个关于无效类型转换的错误。
是否有其他方法将 std::string
转换为 const char*
?
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语言
#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;
}
std::vector
,永远不要使用new T[]
。 - GManNickGstrncpy
而不是 strcpy
? - i486class 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()
已经足够了。只需尝试按对象的生命周期来思考。
str.length()+1
,因为长度不包括空字节。 - wklstd::vector
,永远不要使用 new T[]
。 - GManNickGnew T[]
来代替std::vector<T>
,或者scoped_ptr
/unique_ptr<T[]>
。除非你想编写不安全的异常处理、资源管理不当等糟糕的代码......C++虽然可以是低级的,但这并不意味着你可以、必须或者能够编写差劲的代码而不受惩罚。 - GManNickGconst char* foobar2 = foobar.c_str();
const char*
还是char*
?他应该使用&foobar[0]
还是std::vector<char>
?如果他问目标而不是步骤,我们可以更好地回答这个问题。@Richard:我看到有一个函数接受const char*
和void*
,但没有任何关于char*
的信息。因此,像我们所怀疑的那样,你只需要一个const char*
,因此使用c_str
而不是char*
。(@And @Aar: 看看这个...) - GManNickG