【问题标题】:How to convert std::string to const char*? [duplicate]如何将 std::string 转换为 const char*? [复制]
【发布时间】: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(你是对的,当然)。

标签: c++


【解决方案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。 否则,您必须将其复制到字符缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 2016-09-12
      • 2013-12-21
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多