三种不同的方式来保存分割后的字符串--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;
	}
}
posted on 2011-02-26 20:12  清清飞扬  阅读(2629)  评论(0编辑  收藏  举报