如何将 std::string 转换为 const char*? [复制]
Posted
技术标签:
【中文标题】如何将 std::string 转换为 const char*? [复制]【英文标题】:How to convert std::string to const char*? [duplicate] 【发布时间】:2011-05-11 14:24:27 【问题描述】:可能重复:Convert std::string to const char* or char*
void Foo::bar(const std::string& foobar)
// ...
const char* foobar2 = (char*)foobar;
// ...
这不起作用,我在编译期间收到有关无效转换的错误。
有没有其他方法可以将std::string
转换为const char*
?
【问题讨论】:
@GMan:有很多原因,主要原因是调用 C API 中的函数? @Gman 因为我需要将 foobar 变量传递给 UDT 的 inet_pton 函数,该函数只接受 char* 类型的变量。 @GMan,许多函数仍然需要 (char*),它在 C++ 中大部分是可以避免的,但不是完全可以避免的。 @Andre @Aaron:我很少这样做。你真的认为初学者知道做某事的最佳方法吗?他真的想要const char*
,还是char*
?他应该使用&foobar[0]
,还是std::vector<char>
?如果他asked the goal and not the step,我们可以更好地回答这个问题。 @Richard:我看到一个需要const char*
和void*
,在任何地方都没有char*
。在这种情况下,正如怀疑的那样,您只需要const char*
,因此需要c_str
,而不是char*
。 (@And @Aar:哦,看看那个......)
@GMan:“我希望不要因为未能编写我应该编写的代码而被解雇。有什么想法吗?”。问目标,而不是步骤;-p(你是对的,当然)。
【参考方案1】:
使用foobar.c_str()
。
您可能会发现此链接很有用:http://www.cppreference.com/wiki/string/start
【讨论】:
【参考方案2】:std::string::c_str()
为您提供一个 const char*
指针,该指针指向表示字符串(以空字符结尾)的字符数组。
你不应该操作这个指针指向的数据,所以如果你需要这样做,复制数据。
双重编辑 - 以更 C++ 的方式进行
由于尽可能避免使用原始指针和数组会更好,因此您还可以将数据放入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 更像 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[]
。
@GMan - 谢谢 - 当问题询问指针时,我总是默认采用非常 C 风格的行为,但在 C++ 领域,我知道我应该首先坚持使用 C++ 级别的东西进行教学。跨度>
为什么是strncpy
而不是strcpy
?
这是 strcpy 的安全版本。将长度作为参数,因此它不会超出数组的最大索引。【参考方案3】:
你会在这里得到很多关于str.c_str()
的有点不正确的答案。 :) 虽然c_str()
确实有用,但请记住,这实际上不会将字符串转换为char*
,而是将字符串的内容作为@987654324 返回@。 这是一个很大的不同!
这里重要的是,您从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()
对您来说仍然足够了。试着考虑对象的生命周期。
【讨论】:
应该是str.length()+1
,因为长度不计算空字节。
使用std::vector
,从不使用new T[]
。
@birryree - 没错!谢谢。
@Gman - 我宁愿说“想想,不要盲目听谚语”。 :) 两者都有其应用。 C++ 可用于低级代码,低级结构绝对没有错。
@Kos:你可以随心所欲地写诗,实际上没有理由使用new T[]
代替std::vector<T>
或scoped_ptr
/unique_ptr<T[]>
。当然,除非您尝试编写的代码不是异常安全的、资源管理不善等等……仅仅因为 C++ 可以是低级的并不意味着您可以、必须或将逃脱编写糟糕的代码。【参考方案4】:
const char* foobar2 = foobar.c_str();
注意 const。 否则,您必须将其复制到字符缓冲区。
【讨论】:
以上是关于如何将 std::string 转换为 const char*? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
将 std::string 转换为 const tchar*
将函数参数 `const char*` 转换为 `std::string_view` 是不是安全?
如何在 C++ 中将 std::string 转换为 const char [重复]
将字符串从 std::string 转换为 const char * 时出现数据丢失问题