原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/2019/0725/582.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())
	  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处置,以至可用最原始的字符比拟,再配合一些字串处置函数停止处置。
	但我觉得我提供的运用Find类函数处置字串的2种办法十分常用,可供参考。
	三。比拟
	处置办法
	优
	劣
	用MFC CString之Find处置字符串 分隔符可是是字符或字串;
	在MFC中是最常用的办法。 仅限于MFC中运用
	用AfxExtractSubString 处置 完整封装,调用简单;
	分隔符可是是字符或字串。 仅限于MFC中运用,且未公开;
	普通用于取其中某个子串。
	用C言语之strtok函数处置 分隔符能够同时指定多个字符,可用于分隔符不是很肯定的状况。 分隔符只能是字符;
	C库函数,在C兼容开发环境中通用。
	四。后记
	以上只是我从个人的角度做的一个小结(我用MFC/C++多一些),难免有失偏颇,在BCB/Delphi中肯定也有对应的方式办法,不在本文的讨论范围内,这里就不再赘述。
上篇:上一篇:vc从字符串截取子字符串
下篇:下一篇:让程序在解体时面子的退出之SEH



