• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

技术天地

VC中字符串取子串总结

原创内容,转载请注明原文网址: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