VC中字符串取子串总结- timke的日志- 网易博客
VC中字符串取子串总结
2010-04-15 00:03:06
阅读
29
评论
0
字号:
大
中
小
标签: vc 字符串
最近变成中经常用到字符串处理操作, 其中最多的就是从字符串中取子串了。
今天正好看到这样一个帖子,总结的不错, 引进过来。
------------------
一。前言
程序中经常会遇到要处理用某些符号(如空格,或“, ; . | \t”等)分隔的字符串的问题,我在此做了一些总结和比较。
二。处理方法
1. 用MFC CString之Find处理字符串
// 以下方法将一个字符串分解后放到一个CStringArray中:
void ExtractString(CStringArray& arr, const CString strSrc, const CString sep = "\r\n" )
{
// 预处理: 可根据需要决定是否需要Trim,以及是Trim掉空格/还是分隔符/还是其它
CString str(strSrc);
str.TrimLeft();
str.TrimRight();
if(str.IsEmpty())
return;
// 开始分解
int pos = str.Find(sep);
while (pos != -1)
{
//if(!str.Left(pos).IsEmpty()) // 如有必要也可在此Trim后再判断是否为空,为空则舍弃
arr.Add(str.Left(pos));
str = str.Mid(pos + sep.GetLength());
pos = str.Find(sep);
}
arr.Add(str); // think
}
// BTW,CString提供了TrimLeft和TrimRight,却不能一次TrimAll,并返回Trim后的字符串,我写了一个:
CString TrimAll(CString str, CString strTrim = " ")
{
str.TrimLeft(strTrim);
str.TrimRight(strTrim);
return CString(str);
}
// 同样是用Find处理字符串,和以上处理方式稍有不同,试比较:
void ExtractString2(CStringArray& arr, const CString strSrc, const CString sep = "\r\n" )
{
CString str(strSrc);
if(TrimAll(str).IsEmpty())
return;
// 开始分解
int pos = str.Find(sep);
if(pos == -1) // 未找到分隔符
arr.Add(str);
else // 找到分隔符
{
str += sep; // think
CString s;
while (pos != -1)
{
s = str.Left(pos);
if(!TrimAll(s).IsEmpty())
arr.Add(s);
str = str.Mid(pos + sep.GetLength());
pos = str.Find(sep);
}
}
}
2. 用MFC未公开函数AfxExtractSubString 处理
// 以下为函数定义及说明:
// AfxExtractSubString 从一个字符(chSep)分隔的字符串(lpszFullString)中取出第iSubString个子串,输出到rString
BOOL AFXAPI AfxExtractSubString (
CString& rString, // 用于输出子串
LPCTSTR lpszFullString, // 被分隔的字符串
int iSubString, // zero-based substring index
TCHAR chSep = '\n' // 分隔符
)
// eg:
CString sDesc= "张三|男|28|医生";
CString sOccupation;
if(AfxExtractSubString ( sOccupation, sDesc, 3, '|'))
cout << "职业:" << sOccupation << endl;
3. 用C语言之strtok函数处理
#include <assert.h>
void test()
{
char* str = "06317377244|13805871280|20040210105049|193|NBGW1|040C|0017|8";
char seps[] = ",;|";
char* temp = (char*)malloc(sizeof(char) * (strlen(str)+1));
strcpy(temp, str);
char* token = strtok(temp, seps);
while (NULL != token)
{
printf("%s\t", token);
token = strtok(NULL, seps);
}
free(temp);
}
4. 其它方法
当然既然能用MFC的Find函数进行处理,也可能string的find处理,甚至可用xxx的字符比较,再配合一些字串处理函数进行处理。
但我觉得我提供的使用Find类函数处理字串的2种方法非常常用,可供参考。
三。比较
处理方法 优 劣
用MFC CString之Find处理字符串 分隔符可是是字符或字串;
在MFC中是最常用的方法。 xx于MFC中使用
用AfxExtractSubString 处理 xx封装,调用简单;
分隔符可是是字符或字串。 xx于MFC中使用,且未公开;
一般用于取其中某个子串。
用C语言之strtok函数处理 分隔符可以同时指定多个字符,可用于分隔符不是很确定的情况。 分隔符只能是字符;
C库函数,在C兼容开发环境中通用。
四。后记
以上只是我从个人的角度做的一个小结(我用MFC/C++多一些),难免有失偏颇,在BCB/Delphi中肯定也有对应的方式方法,不在本文的讨论范围内,这里就不再赘述。
this.p={ m:2, b:2, id:'fks_080071087082081074093084094095085086080070092081085067082', blogTitle:' VC中字符串取子串总结', blogUrl:'blog/static/1015873062010315036490', isPublished:1, istop:false, type:0, modifyTime:1271260986490, permalink:'blog/static/1015873062010315036490', commentCount:0, mainCommentCount:0, recommendCount:0, friendstatus:'none', followstatus:'unFollow', pubSucc:'' }
{list a as x} {if !!x} {/if} {/list}
{if !!a} {/if}
<#--{zx1}日志-->
{list a as x} {if !!x}
{/if} {/list}
<#--推荐日志-->
推荐过这篇日志的人:
{if !!b&&b.length>0}
他们还推荐了:
{list b as y} {if !!y}
·
{/if} {/list}
{/if}
<#--引用记录-->
引用记录:
{list d as x}
·
{/list}
<#--相关日志-->
{list a as x} {if !!x}
{/if} {/list}
<#--推荐日志-->
{list a as x} {if !!x}
{/if} {/list}
<#--推荐阅读-->
{list a as x} {if !!x}
{/if} {/list}
<#--右边模块结构-->
{zx1}日志
推荐日志
相关日志
推荐阅读
<#--评论模块结构-->
<#--引用模块结构-->
#--引用模块结构-->#--评论模块结构-->#--右边模块结构-->#--推荐阅读-->#--推荐日志-->#--相关日志-->#--引用记录-->#--推荐日志-->#--{zx1}日志-->
郑重声明:资讯 【VC中字符串取子串总结- timke的日志- 网易博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【
在线投诉
】,我们审核后将会尽快处理。
——
相关资讯
——
重庆回收电子元件重庆回收集成电路我们专业
2019/8/22
四平ohsas18001认证哪家好_吉林鸿诺企业管理咨询
2018/8/18
新疆色差光伏电池板回收18861926626免费检测
2017/5/5
陈江割包皮
2015/12/3
沈阳动脉硬化的症状【301军科微创】
2015/12/21
选购质量好的旋风除尘器就选祥发环保,旋风除尘器哪里买
2016/5/29
开封商标申请,郑州哪里有提供商标注册
1900/1/1
《晴窗软谈》抄(3)_im007_新浪博客
2010/4/17
声发射技术基础- 恒兴NDT的日志- 网易博客
2010/4/22
纯手工活の秀秀们_露倩博客
2010/6/12
液晶电视升降器带给你不一样的视觉
2012/9/13
漯河白癜风专科医院电话
2015/2/10
我是不是xx松弛◆
2015/3/22