OOIII/

C++ 转换std::string 至char*

介绍几种std::string 转 char*的方法
1、const_cast operator
string::c_str()string::data() 都能返回const char* , 要得到一个non-const版本,我们可以使用const_cast移除const属性,由于不涉及复制,因此有固定的时间开销.
注意,这种方法会直接修改std::string底层数据,任何对char*的修改都会表现在string上

#include <iostream>
#include <string>
 
int main()
{
    std::string str = "std::string to char*";
 
    char* c = const_cast<char*>(str.c_str());
    std::cout << c;
 
    return 0;
}

2、strcpy()
string::c_str()string::data() 的返回值const char* 传递给strcpy,该函数内部将其复制到指定的字符串数组中并返回指针。

#include <iostream>
#include <string>
#include <cstring>
 
int main()
{
    std::string str = "std::string to char*";
 
    char* c = strcpy(new char[str.length() + 1], str.c_str());
    std::cout << c;
 
    delete[] c;
    return 0;
}

3、std::copy
strcpy 是C 函数,推荐使用标准模板库函数std::copy

#include <iostream>
#include <string>
 
int main()
{
    std::string str = "std::string to char*";
    int len = str.size();
 
    char *c = new char[len + 1];
    std::copy(str.begin(), str.end(), c);
    c[len] = '\0';
 
    std::cout << c;
 
    delete[] c;
    return 0;
}

4、std::vector
std::string 在c++98/03标准下不能保证内存连续,可以先转为std::vector获得连续内存,后通过&chars[0]或&*chars.begin()获取指向底层字符串的指针

#include <iostream>
#include <string>
#include <vector>
 
int main()
{
    std::string str = "std::string to char*";
 
    std::vector<char> chars(str.begin(), str.end());
    chars.push_back('\0');
 
    char *c = &chars[0];
    std::cout << c;
 
    return 0;
}

5、C++11 std::string 连续存储
c++98/03标准不同,C++11 保证std::string 内存分配是连续的,因此可以直接调用&str[0]或者&*str.begin()来获取指向底层数组的指针.由于不涉及复制,时间开销固定,但是对char*做的左右修改都会反应到std::string

#include <iostream>
#include <string>
 
int main()
{
    std::string str = "std::string to char*";
 
    char* c = &*str.begin();
    std::cout << c;
 
    return 0;
}

转自 https://www.techiedelight.com/convert-std-string-char-cpp/

留下一条评论

暂无评论