- 使用const_cast运算符
string::c_str
和string::data
函数都返回const char *
。要获得非const类型的返回,可以使用const_cast
运算符,它删除const
属性。并且不涉及复制,可以在稳定的时间内工作
注意这种方法能直接访问std::string
,这意味着任何对更改char *
都将同时反映在字符串对象上,反之也一样
#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;
}
- 使用
strcpy()
功能
const char *
将string::c_str
或string::data
函数的返回值传递给strcpy()
函数,函数在内部将其复制到指定的字符数组中,并返回一个指针it
#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;
}
- 使用
std::copy
功能
strcpy()
是C语言的风格,并不是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;
}
- 使用
std::vector
功能
std::string
在C++98/03标准下,不能保证内存分配是连续的。这个做法是将字符串转化为一个字符向量,其内存分配是连续的。然后调用&str[0]
来获取指向底层字符数组的指针&*str.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;
}
- C++11中
std::string
函数的连续存储
与C++98/03标准不同,C++11中保证内存分配std::string
是连续的。因此可以用std::string
通过调用&str[0]
或&*str.begin()
函数来获取指向背后底层数组的指针。
由于不涉及复制,也可以在稳定的时间内工作。注意的是和第一种方法一样,任何更改char *
的动作都会反映在字符串对象中,反之也一样
#include <iostream>
#include <string>
int main()
{
std::string str = "std::string to char*";
char* c = &*str.begin();
std::cout << c;
return 0;
}