三种不同的方式来保存分割后的字符串--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([email protected])



	功能:封装的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;

	}

}

你可能感兴趣的:(字符串)