VC中字符串取子串总结

转载 2012年03月27日 09:53:35
一。前言
程序中经常会遇到要处理用某些符号(如空格,或“, ; . | /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中肯定也有对应的方式方法,不在本文的讨论范围内,这里就不再赘述。

获取字符串中的子串

下列代码实现了:去除字符串中空格 字符串的分割 去除字符串中空格的基本思想:从字符串第一个字符串开始遍历,若遇到空格,就将空格后的字符前移,重复直至遍历到字符串结束。 提取主字符串中的子串的基本思...
  • CCSUXWZ
  • CCSUXWZ
  • 2017年07月05日 14:21
  • 378

Java中字符串中子串的查找方法的总结

Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下: 1、int indexOf(String str) :返回第一次出现的指定子字符串在此...
  • jcl490195138
  • jcl490195138
  • 2016年05月27日 15:17
  • 6737

获取字符串中的子串

一道面试题,根据输入字符串输出其子串字符串数组。
  • dotnetstudio
  • dotnetstudio
  • 2014年12月14日 22:18
  • 2432

C语言版字符串中获得子串的函数,获取字符串中指定位置的子串

C语言版字符串中获得子串的函数,获取字符串中指定位置的子串。如同C++中的string类型、VC++中CString类型、Objective-C的NSStringd等字符串类中的获取子串的方法,C语言...
  • dezhihuang
  • dezhihuang
  • 2015年11月04日 21:12
  • 5265

正则表达式提取String子串

最近遇到了一个字符串处理的功能,忽然发现了正则表达式的强大,深深的被她的迷人魅力所吸引,以前只是听说,今天亲眼所见,亲身经历,真的彻底折服。 言归正传:java中String类里面封装了很多字符串处...
  • zchunhe
  • zchunhe
  • 2013年08月14日 12:39
  • 6485

String对象中用于搜索和提取子字符串的方法

今天看原来同事写的代码第一次见到String.lastIndexOf()用法,查询分享一下。 string.lastIndexOf('.')  表示的就是在字符串中第一个最后一个出现“ . ”  的...
  • jia635
  • jia635
  • 2015年02月12日 13:58
  • 2170

[面试题] 查找最长不含相同字符的连续子串

题意:由26个小写字母组成的字符串str,在str中查找最长但不含相同字符的连续子串。 1, 由于字符串只由小写字母组成,那么这个连续的字符串最长不会超过26。 2, 由于是连续的子串,那么很容易想到...
  • dreamzk
  • dreamzk
  • 2013年11月18日 23:11
  • 1071

字符串子串的查找

1. 考虑用标准函数库中 strstr() 函数 包含文件:string.h 函数名: strstr 函数原型:extern char *strstr(char *str1, char *str2);...
  • Arcsinsin
  • Arcsinsin
  • 2013年09月29日 14:33
  • 34360

黑马程序员_编写程序,获取两个字符串中最大相同子串

------- android培训、java培训、期待与您交流!---------        前段时间看完了毕老师关于字符串讲解的视频,最近为了加强对字符串的理解,就找到了获取两个字符串的最大子...
  • LFB168
  • LFB168
  • 2015年09月19日 11:05
  • 829

java基础—找出两个字符串中最大的子串

找出两个字符串中最大相同的子串 public class StringMaxString { //找一个字符串的最大子串 public static void main(String[] args...
  • zl18603543572
  • zl18603543572
  • 2015年06月18日 15:06
  • 2187
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC中字符串取子串总结
举报原因:
原因补充:

(最多只允许输入30个字)