如何将 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&lt;T&gt;scoped_ptr/unique_ptr&lt;T[]&gt;。当然,除非您尝试编写的代码不是异常安全的、资源管理不善等等……仅仅因为 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 * 时出现数据丢失问题

无法从 'const std::string [3]' 转换为 'std::string'

如何在MFC中将std:string转换为LPCTSTR