string和字符数组间的转换

string虽然用起来非常方便,但是有些封装的函数只支持char*,所以,今天在这里记录一下stringchar*之间的转换

string转char*

1
2
char *cs = new char[strlen(str.c_str)+1]; // 此处一定用strlen,之间用str.size()会出错
strcpy(cs, str.c_str());

char*转string

1
2
3
4
5
6
char cs[10] = "abcdef";
// 赋值转换
string str1 = cs;
// 构造转换
string str2(cs);
string str3(cs, cs+strlen(cs));

应用

封装的对string类型进行split的函数 (借助c语言)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vector<string> split2(const string &str, const string &pattern)
{
char * strc = new char[strlen(str.c_str())+1];
strcpy(strc, str.c_str()); //string转换成C-string
vector<string> res;
char* temp = strtok(strc, pattern.c_str());
while(temp != NULL)
{
res.push_back(string(temp));
temp = strtok(NULL, pattern.c_str());
}
delete[] strc;
return res;
}

另一种思路:

1
2
3
4
5
// 使用strstr()函数, 返回检索字符串在字符串中首次出现的位置
char *strstr( char *str, char * substr );
// memcpy()函数可以拷贝任意类型的数据。因为并不是所有的数据都以null 字符结束,所以你要为memcpy()函数指定要拷贝的字节数
// 最重要的用途!!!是拷贝任意的数据类型!!!!!
void *memcpy(void *dest, const void *src, size_t n);

实现split得另一种方法,两种方法复杂度相同
暂且可以认为这种方法稍稍好一丢丢(虽然每依据,看到程序运行时间)

1
2
3
4
5
6
7
8
9
10
11
vector<string> split2(const string &str, const string &pattern) {
int beg = 0, pos, len=pattern.size();
vector<string> ret;
while ((pos = str.find(pattern, beg)) != string::npos) {
string temp = str.substr(beg, (pos-beg));
ret.push_back(temp);
beg = pos + len;
}
ret.push_back(str.substr(beg));
return ret;
}