实际应用中这个问题也难以避免,很多时候我们还是需要将string类型的转化为 char*来实现自定义的操作,C++标准库也为了和之前用C写的程序兼容,于是可以用string的c_str()函数。
string var = “Olympic”;
char *ptr = var.c_str(); //还不能被编译
但是c_str()为了防止意外地修改string对象,返回的是const指针,所以上面这段代码是不能被编译的。正确的应该是用const指针。
string var = “Olympic”;
const char *p = var.c_str(); //Correct!
这个c_str()方法在C++IO流操作上也被广泛应用。
在打开文件时,如果要指定文件名,可以用C风格的字符串。如果用到string类型的字符串作为文件名时,就必须调用c_str()方法将其转换为一个C风格字符串。
/*
** 编写程序读入一组string数据,并将它们存储在vector中,接着,把该vector对象复
** 制给一个字符指针。为vector中的每个元素创建一个新的字符数组,并把vector元素
** 的数据复制到相应的字符数组中,最后把指向该数组的指针插入字符指针数组
*/
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
using namespace std;
int main()
{
vector<string> svec;
string str;
while(cin >> str) //熟人vector元素
{
svec.push_back(str);
}
char **pps = new char* [svec.size()]; //创建指针数组
//处理vector元素
char **ppt = pps;
for(vector<string>::iterator iter = svec.begin(); iter != svec.end(); iter++)
{
char *p = new char[(*iter).size() + 1]; //创建字符数组
strcpy(p, (*iter).c_str()); //将vector的每个元素复制到字符数组中
*ppt++ = p; //将指向字符数组的指针插入到字符数组
}
//输出并释放字符数组
for(ppt = pps; ppt != pps + svec.size(); ppt++)
{
cout << *ppt << endl;
delete [] (*ppt); //别忘了[],否则释放不掉
}
delete [] pps; //释放指针数组
return 0;
}