三种不同的方式来保存分割后的字符串--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; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)