三种不同的方式来保存分割后的字符串--strtok
主文件:
/*
功能:主要是实现字符串分割,并选择了三种不同的方式来保存结果。
最终证明:可能最方便的还是第一种方法(方便、快捷,不用自己做太多的工作,可以自己维护内存空间)
*/
#include <iostream>
#include <vector>
#include "z_string.h"
using namespace std;
void Spliter(char* pSrc, char* spliter, vector<string>& v)
{
char* token = NULL;
char* temp = new char[strlen(pSrc)+1];
strcpy(temp, pSrc);
token = strtok(temp, spliter); // strtok会改变temp的值,所以上面作了拷贝字符串的工作
while(token)
{
v.push_back(token);
token = strtok(NULL, spliter);
}
delete temp;
}
void Display(vector<string>& v)
{
for(vector<string>::iterator it = v.begin(); it != v.end(); it++)
{
cout<<"#"<<it->c_str()<<"#"<<endl;
}
}
string* Spliter(char* pSrc, char* spliter)
{
string* ret = NULL;
char* token = NULL;
vector<string> v;
char* temp = new char[strlen(pSrc)+1];
strcpy(temp, pSrc);
token = strtok(temp, spliter);
while(token)
{
v.push_back(token);
token = strtok(NULL, spliter);
}
delete temp;
int n = v.size();
ret = new string[n+1];
char t[20] = {0};
itoa(n, t, 10);
ret[0] = t; // 第一个元素保存数组长度
for(int i = 1; i <= n; i++)
{
ret[i] = v.at(i-1);
}
return ret;
}
void Display(string* pList)
{
int n = atoi(pList[0].c_str());
for(int i = 1; i <= n; i++)
{
cout<<"#"<<pList[i].c_str()<<"#"<<endl;
}
}
void main()
{
char src[] = "what are you, do 1.0, 2.33, 556";
char spliter[] = ", \t\n";
// 法一:用vector<string>保存分割后的结果
vector<string> v1;
Spliter(src, spliter, v1);
Display(v1);
// 法二:用string[]保存结果
cout<<endl;
string* pList = Spliter(src, spliter);
Display(pList);
delete [] pList; // 写成“delete pList;”将出错
// 法三:自定义类来管理空间
cout<<endl;
z_string zs;
zs.Spliter(src, spliter);
zs.Display();
}
z_string.h:
#include <string>
using namespace std;
// 经过封闭的string[]类,动态可变的元素个数及自动地管理所分配的空间
class z_string
{
private:
int length;
string* list;
public:
z_string(int n = 0);
~z_string();
void Spliter(char* src, char* op);
int getSize();
string at(int n) const;
void Display();
void Free();
};
z_string.cpp:
/*
2011-2-26 20:15 JoeBlackZQQ(joeblackzqq@163.com)
功能:封装的string类,主要功能是对字符串进行分割,再保存结果,可自己维护内存
*/
#include <iostream>
#include <vector>
#include "z_string.h"
z_string::z_string(int len)
{
if(len > 0)
{
list = new string[len];
length = len;
}
else
{
length = 0;
list = NULL;
}
}
z_string::~z_string()
{
Free();
}
void z_string::Spliter(char* src, char* separator) // 对字符串进行分割,并保存结果
{
Free();
int len = strlen(src) + 1;
char* pTemp = new char[len];
strcpy(pTemp, src);
char* token = NULL;
vector<string> v;
token = strtok(pTemp, separator);
while(token)
{
v.push_back(token);
token = strtok(NULL, separator);
}
delete pTemp;
length = v.size();
list = new string[length];
for(int i = 0; i < length; i++)
{
list[i] = v.at(i);
}
}
int z_string::getSize()
{
return length;
}
string z_string::at(int i) const
{
if(i >= 0 && i < length)
{
return list[i];
}
else
return NULL;
}
void z_string::Display()
{
for(int i = 0; i < length; i++)
{
cout<<list[i].c_str()<<endl;
}
}
void z_string::Free()
{
if(list)
{
delete [] list;
list = NULL;
length = 0;
}
}
浙公网安备 33010602011771号