三种不同的方式来保存分割后的字符串--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; } }