转:http://blog.sina.com.cn/s/blog_5f93da790100deah.html
程序中经常会遇到要处理用某些符号(如空格,或“, ; . | \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())
// 开始分解
int pos = str.Find(sep);
while (pos != -1)
{
}
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" )
{
// 开始分解
int pos = str.Find(sep);
if(pos == -1) // 未找到分隔符
else
{
}
}
2. 用MFC未公开函数AfxExtractSubString 处理
// 以下为函数定义及说明:
// AfxExtractSubString 从一个字符(chSep)分隔的字符串(lpszFullString)中取出第iSubString个子串,输出到rString
BOOL AFXAPI AfxExtractSubString (
// eg:
CString sDesc= "张三|男|28|医生";
CString sOccupation;
if(AfxExtractSubString ( sOccupation, sDesc, 3, '|'))
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));
free(temp);
}
4. 其它方法
当然既然能用MFC的Find函数进行处理,也可能string的find处理,甚至可用最原始的字符比较,再配合一些字串处理函数进行处理。以下再介绍一种用sscanf配合通配符方法:
CString str = "abc$中国$12345$,。‘ ";
char a1[8],a2[8],a3[8],a4[8];
sscanf(str,"%[^$]$%[^$]$%[^$]$%[^&]",a1,a2,a3,a4);
AfxMessageBox(str);
AfxMessageBox(a1);
AfxMessageBox(a2);
AfxMessageBox(a3);
AfxMessageBox(a4);
但我觉得我提供的使用Find类函数处理字串的2种方法非常常用,可供参考。
处理方法
用MFC CString之Find处理字符串
优:
劣:
用AfxExtractSubString 处理
优:
劣:
用C语言之strtok函数处理
优:
劣: 分隔符只能是字符;C库函