字符串按照特定字符进行分割是编程时候经常要用到方法

来源:互联网 发布:淘宝店铺贷款在哪里 编辑:程序博客网 时间:2024/05/16 09:56

字符串按照特定字符进行分割是编程时候经常要用到方法

MFC中CString 和std::string 常可以用 find() + Mid() 的方法来实现

 

CString实现:

Cpp代码 复制代码
  1. inline static void split(CString src, CString token, vector<CString>& vect)   
  2. {   
  3.     int nend=0;   
  4.     int nbegin=0;   
  5.     while(nend != -1)   
  6.     {   
  7.         nend = src.Find(token, nbegin);   
  8.         if(nend == -1)   
  9.             vect.push_back(src.Mid(nbegin, src.GetLength()-nbegin));   
  10.         else  
  11.             vect.push_back(src.Mid(nbegin, nend-nbegin));   
  12.         nbegin = nend + 1;   
  13.     }   
  14. }   

std::string实现

Cpp代码 复制代码
  1. inline static void split(std::string src, std::string token, vector<std::string>& vect)   
  2. {   
  3.     int nend=0;   
  4.     int nbegin=0;   
  5.     while(nend != -1)   
  6.     {   
  7.         nend = src.find_first_of(token, nbegin);   
  8.         if(nend == -1)   
  9.             vect.push_back(src.substr(nbegin, src.length()-nbegin));   
  10.         else  
  11.             vect.push_back(src.substr(nbegin, nend-nbegin));   
  12.         nbegin = nend + 1;   
  13.     }   
  14. }  

上面2个例子中,分割出来字符串都是重新分配了内存的。

例如CString中Mid()函数就会

 

        CString dest;
        AllocCopy(dest, nCount, nFirst, 0); //这个地方将会为 dest分配内存空间 
        return dest;

 

所以在负荷较高的运行环境下会频繁的分配小块内存和释放小块内存,比较容易生产内存碎片,而且效率也不高。

 

潜意识中喜欢追求底层细节,让我想了解 在C语言中 char * 到底是怎么实现分割的?

果不其然C语言中的 strtok() 函数能够实现字符串的分割而且效率超高,不需要对分割后的字符串进行内存分配,而只是将被分割字 符中的 分隔符 ( token ) 以/0代替。而大家都知道 字符串都是以/0结尾的,所以这样就达到了将一个整串分割成多个字符串的目的。

char * 实现:

Cpp代码 复制代码
  1. inline static void Split(const char* content, const char* token, vector<std::string>& vect)   
  2. {   
  3.     if(content == NULL)   
  4.            return;   
  5.     int len = strlen(content);   
  6.     if(len  <= 0)   
  7.         return;   
  8.     char* pBuf =(char*)malloc(len+1);   
  9.     strcpy(pBuf , content);   
  10.     char* str = strtok(pBuf , token);   
  11.     while(str != NULL)   
  12.     {   
  13.         vect.push_back(str);   
  14.         str = strtok(NULL, token);   
  15.     }   
  16.     free(pBuf);   
  17. }  

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机酷狗音乐下载歌曲要钱怎么办 酷狗下载歌曲后歌词不见了怎么办 手机酷我音乐缓冲文件损坏怎么办 苹果手机音乐里的歌删掉了怎么办 上课学生把粉笔擦藏起来了怎么办 手机没法解压10g压缩包怎么办 苹果id被锁邮箱也忘记密码怎么办 手机号注册的微信忘记密码怎么办 qq号注册微信忘记密码怎么办 云课堂密码忘记手机号更改了怎么办 孩子做事才要奖励怎么办的教案 员工做事效率低家庭情况不好怎么办 安全云课堂人脸识别失败怎么办 酷我k歌里音乐太少怎么办 酷狗里面的歌没有了怎么办 第一试用网登录密码忘记了怎么办 第一试用网登录密码忘了怎么办 微博登录直播间帐号被锁定怎么办 硫酸不小心弄到皮肤上怎么办 小米平板进水了开不了机怎么办 U盘被弹出后再插没有显示怎么办 视频从U盘传下来不能播放怎么办 微博账号忘了登录名怎么办 迅雷应版权方要求无法下载怎么办? 微信账号忘记密码上面有钱怎么办 蘑菇街账号忘记了里面有钱怎么办 手机注册的百度云帐号换号怎么办 网易云音乐sd卡写入失败怎么办? 玩客云涌u盘满了怎么办 手机安装杜比音效失败死机该怎么办 网易云音乐下载额度用完了怎么办 苹果手机付费app连续扣费怎么办 oppoO粉卡的流量用没了怎么办 qq邮箱里的文件过期了怎么办 163邮箱里的文件过期了怎么办 做人事的给员工漏交社保了怎么办 公司漏交了员工一个月的社保怎么办 小米4c能充电不能开机怎么办 小米手机关机开不开机该怎么办 小米5s关机开不开机怎么办 老板跑路了员工社保还挂着怎么办