惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
U
Unit 42
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
F
Full Disclosure
月光博客
月光博客
Engineering at Meta
Engineering at Meta
博客园_首页
The Register - Security
The Register - Security
G
Google Developers Blog
The Cloudflare Blog
博客园 - Franky
K
Kaspersky official blog
A
Arctic Wolf
Scott Helme
Scott Helme
C
Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
C
Check Point Blog
NISL@THU
NISL@THU
AI
AI
D
DataBreaches.Net
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
Project Zero
Project Zero
The GitHub Blog
The GitHub Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Vercel News
Vercel News
T
Tor Project blog
P
Privacy International News Feed
D
Docker
I
Intezer
L
LangChain Blog
P
Proofpoint News Feed
Security Latest
Security Latest
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
博客园 - 聂微东
AWS News Blog
AWS News Blog
Martin Fowler
Martin Fowler
P
Privacy & Cybersecurity Law Blog
V
V2EX
Last Week in AI
Last Week in AI
C
Cybersecurity and Infrastructure Security Agency CISA
The Hacker News
The Hacker News
T
Tenable Blog
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog

博客园 - 凌点

clr20r3 system.InvalidOperationException 程序终止的几种解决方案 能上Q 不能上网 JavaScript中url 传递参数(特殊字符) apache 多站点配置 C#中使用 SendMessage 向非顶端窗体发送组合键 System.Xml.XmlException: 根级别上的数据无效 XP,WIN7双系统启动问题 VM安装XP注意事项 VC 命令行 捕获输出 make 信息重定向 VC 进度条制件CProgressCtrl 用法笔记 VC List Control控件高级使用 List Control 控件技巧总汇 如何禁用Windows屏保和电源管理 VC获取硬盘物理序列号 unicode cstring to char* - 凌点 将unicode的 Cstring 复制到粘贴板 VC由进程ID获取窗口句柄 嵌入式Linux操作系统学习规划
VC中字符串取子串总结
凌点 · 2009-11-25 · via 博客园 - 凌点

最近变成中经常用到字符串处理操作, 其中最多的就是从字符串中取子串了。
今天正好看到这样一个帖子,总结的不错, 引进过来。
------------------

一。前言

程序中经常会遇到要处理用某些符号(如空格,或“, ; . | \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中肯定也有对应的方式方法,不在本文的讨论范围内,这里就不再赘述。