How to convert std::string to const char*?
Possible Duplicate:
Convert std::string to const char* or char*
1 2 3 4 5
| void Foo::bar(const std::string& foobar) {
// ...
const char* foobar2 = (char*)foobar;
// ...
} |
这不起作用,在编译无效的强制转换时我会得到一个错误。
是否有其他方法将std::string转换为const char*?
- 你为什么要这样做?
- @GMAN:原因很多,主要是调用C API中的函数?
- @因为我需要将foobar变量传递给udt的inet函数,该函数只接受char*类型的变量。
- gman,许多函数仍然需要(char),它在C++中是可以避免的,但不是完全的。
- @安德烈@亚伦:我很少这样做。你真的认为初学者知道做某件事的最好方法吗?他真的想要const char*还是char*?他应该使用&foobar[0]还是std::vector?如果他问的是目标而不是步骤,我们可以更好地回答这个问题。@理查德:我看到一个拿着一个const char*和一个void*,任何地方都没有。在这种情况下,正如怀疑的那样,你只需要一个const char*,因此c_str,而不是char*。(@和@aar:哦,看那个…)
- 与大多数健全的C API一样,inet_pton(3)采用const char*。当然,还有一些疯狂的…
- @对不起,你是对的。它需要const char*。不好意思弄混了。
- @GMAN:"我希望不会因为写不出我应该写的代码而被解雇。有什么想法吗?".询问目标,而不是步骤;-p(当然,你是对的)。
- 史提夫:Haha。:)
使用foobar.c_str()。
你会发现这个有用的链接:http://///启动www.cppreference.com字符串维基
你能std::string::c_str()const char*字符指针数组与字符串(这是空终止)。
你不应该manipulate指针的数据这一点,所以如果你需要的是,复制的数据。
双编辑做它在更多的C + +时尚
因为它是nicer避免使用原始分,在与阵列的可能,你也可以把这个数据到一个std::vector
1 2 3 4 5 6 7 8 9 10
| #include <string>
#include <vector>
int main()
{
std::string str ="Hello";
std::vector<char> cvec(str.begin(), str.end());
// do stuff
} |
这是因为更多的编辑它使用原始分,C类和明确allocates MEM
1 2 3 4 5 6 7 8 9 10 11 12
| #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[]。
- 当我问一个关于指针的问题时,我总是默认非常C风格的行为,尽管在C++领域我知道我应该坚持用C++级的东西来教。
- 为什么是strncpy而不是strcpy?
- 这是Strcpy的安全版本。获取长度作为参数,这样它就不会超出数组的最大索引。
你会得到不正确的答案有很多关于str.c_str()这里。而事实上c_str())是有用的,请保持头脑,这真的不会对char*转换字符串,而字符串返回的内容的const char*。这是一个大的差。
什么是重要的是,你在c_str()指针是有效的,只有到了龙的string对象存在。所以这将是错误的:terribly
1 2 3 4 5 6 7
| 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独立,然后你会想的东西,像这样:
1 2 3 4 5
| 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,因为长度不计算空字节。
- 使用std::vector,切勿使用new T[]。
- @伯瑞瑞-没错!谢谢。
- @我宁愿说"想想,不要盲目地听谚语"。:)两者都有各自的应用程序。C++可以用于低级代码,而低级结构绝对没有错。
- @科斯:你可以随心所欲地富有诗意,从字面上看,没有理由用new T[]代替std::vector,或者scoped_ptr,unique_ptr。当然,除非你试图编写不例外安全的代码,管理好它的资源等等。只是因为C++可以是低级别的,这并不意味着你可以,必须,或将逃脱编写不良代码。
- 我想说STD::向量已经相当低了。与原始数组相比,很少有理由不喜欢它;抽象级别不是其中之一。
- GMman:我理解你的观点,但是我们不要忘记,在C++中,手动内存处理是一个需要注意的问题,需要注意的不是使用"智能"指针或任何其他语言构造。正确的代码是思想良好、可维护的代码,具有明确的对象范围和所有权规则。模板是一个有用的工具,使用它们不会使代码自动安全。思考是使代码安全的原因。我将继续使用C++的FQA观点。
- @ KOS:啊,你和C++社区中的很多人相处不上FQA。我发现说"正确的代码是经过深思熟虑和维护的代码,具有明确的对象范围和所有权规则"是很矛盾的,然后转身从函数传递一个没有所有权的原始指针。不管你喜不喜欢,C++都是关于黑箱的。有些东西做了它应该做的,所以你使用它。教一次内存管理,然后在其他地方使用容器。
- @格曼尼克,你好,从2017年开始!我完全同意你的看法。原始指针,brr。我希望我答案的前几句话是可以挽救的。
- @科斯:哈哈,很好。:)
1
| const char* foobar2 = foobar.c_str(); |
声明的常量。否则,你必须将它复制到字符串缓冲区。