代码之家  ›  专栏  ›  技术社区  ›  Richard Knop

如何将std::string转换为const char*?[副本]

c++
  •  26
  • Richard Knop  · 技术社区  · 14 年前

    可能重复:
    Convert std::string to const char* or char*

    void Foo::bar(const std::string& foobar) {
        // ...
        const char* foobar2 = (char*)foobar;
        // ...
    }
    

    这不起作用,我得到一个关于无效的铸造编译错误。

    有别的方法可以转换吗 std::string const char* ?

    4 回复  |  直到 7 年前
        1
  •  47
  •   Angie Quijano Nejat    8 年前

    使用 foobar.c_str() .

    您可能会发现此链接很有用: http://www.cppreference.com/wiki/string/start

        2
  •  11
  •   wkl    14 年前

    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
    }
    

    编辑这更像C,因为它使用原始指针并显式地分配mem

    #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;
    }
    
        3
  •  4
  •   Kos    14 年前

    你会得到很多 有点不正确 关于的答案 str.c_str() 在这里。:)同时 c_str() 确实有用,请记住 将字符串转换为 char* ,但是 将字符串的内容返回为 const char* . 这是一个很大的不同!

    这里最重要的是你从 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() 在大多数情况下对你来说已经足够了。试着用物体的生命时间来思考。

        4
  •  3
  •   fabmilo    14 年前
    const char* foobar2 = foobar.c_str();
    

    注意 常量 . 否则你必须把它复制到一个字符缓冲区。