起因:前段时间写命令行解析函数(字符串分割比较通用的例子),没有经过深入思考和分析引起了程序死循环,就想了下是否有对应的系统函数可以使用。经过一番搜索之后发现还是有几个可用的字符串分割函数,这里整理下,以作总结及后续查询使用。

当然,如果你觉得自己的字符串处理可以做的很好,可以考虑直接使用字符串查找函数做字符串分割,比如c中的字符串查找函数、CString字符查找函数、string字符查找函数等,更原始点可以直接操作内存。

windows下有以下几种可用的字符串分割方法。

CString::Tokenize()

用法如下。

// 按照token分割source字符串,结果通过cout输出
// 使用MFC的CString::Tokenize
void SplitUseTokenize(const char * source, char token)
{CString strSource = source;CString strToken(token);int pos = 0;while (-1 != pos){CString strCur = strSource.Tokenize(strToken, pos);if (!strCur.IsEmpty()){cout << strCur << endl;}}cout << endl << endl;
}

Tokenize函数将分割好的字串放到返回值中,同时将对应的扫描位置放到第二个参数中,如果第二个参数返回-1,表示分割完成。

AfxExtractSubString()函数

// 按照token分割source字符串,结果通过cout输出
// 使用MFC中的AfxExtractSubString函数
void SplitUseExtract(const char * source, char token)
{int pos = 0;CString strCur = "";while(AfxExtractSubString(strCur, source, pos, token)){++pos;cout << strCur << endl;}cout << endl << endl;
}

 AfxExtractSubString函数返回值表示是否提取子串成功,还有几个重载函数,可以参考msdn上的说明。

提取得到子串放到第一个参数中。 

c语言的strtok()函数

// 按照token分割source字符串,结果通过cout输出
// 使用crt的strtok函数
void SplitUseStrtok(char * source, char token)
{char * ptr = strtok(source, &token);while(NULL != ptr){   cout << ptr << endl;ptr = strtok(NULL, &token);}
}

strtok函数不是线程安全的,不是可重入的,需要线程安全的函数,建议使用strtok_r函数。具体用法可参考c语言用户手册。

这里需要说明的是:

CString::Tokenize()中的PCXSTR pszTokens为分隔字符的组合,可为多个字符。

AfxExtractSubString()中的分隔字符,只能是一个字符。

另外有一点要注意:

CString::Tokenize()碰到连续多个分隔字符是作为一个处理的,AfxExtractSubString()中多个分隔符可区分处理。

strtok/strtok_r函数的处理逻辑跟CString::Tokenize()类似。

如果使用下面测试程序,输出如下:

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{int nRetCode = 0;// 初始化 MFC 并在失败时显示错误if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)){// TODO: 更改错误代码以符合您的需要_tprintf(_T("错误: MFC 初始化失败\n"));nRetCode = 1;}else{// TODO: 在此处为应用程序的行为编写代码。char source[] = "123\n\n456\n789";char token = '\n';SplitUseTokenize(source, token);SplitUseExtract(source, token);SplitUseStrtok(source, token);system("pause");}return nRetCode;
}

  

这个输出也说明了本文中提及的注意事项问题。

注:本文涉及所有代码可使用Git直接下载:https://git.oschina.net/Tocy/SampleCode.git。实际代码位于Console目录下,名称为“20150709_StringSplit.cpp”。

常用的字符串分割方法相关推荐

  1. C++字符串分割方法总结

    在一些编程练习中,经常会对字符串进行处理,往往处理之前都会对字符串进行分割来提取各部分信息.在C++中虽然没有像python那样提供split这样直接的字符串分割函数,但也有一些其他的方法能够对其进行 ...

  2. C++常用字符串分割方法

    From:http://www.jb51.net/article/55954.htm 1. 用strtok函数进行字符串分割 原型:       char *strtok(char *str, con ...

  3. JS之字符串分割方法split

    作用:JavaScript split() 方法用于把一个字符串分割成字符串数组 语法:stringObject.split(separator,howmany) 参数1:separator必选,字符 ...

  4. excel 中文转英文首字母大写,数据透视表制作,字符串分割方法

    1.中文转英文首字母大写,我的excel是2007版本的, 把下面的代码复制到宏模板里面,然后直接关闭就好了 Function getpychar(char) tmp = 65536 + Asc(ch ...

  5. java字符串分割方法.split()的详细用法

    先看看它在java包中的Java API是: java.lang.String 方法总结 (1)按指定普通字符分割: java代码如下:String string="123@456@789& ...

  6. [转载] Java字符串分割方法

    参考链接: Java中的StringTokenizer方法的示例 2 [size=medium]1.用split()方法进行分割,分割开的子字符串放入数组,然后进行处理. 示例代码如下: public ...

  7. Java字符串分割方法split()的功能以及使用方法的详细介绍!

    在Java的学习中经常会遇到按照自己的理想情况分割字符串,并根据分割后的结果进行后续操作的问题.对于这些问题就可以使用Java提供的split() 方法进而实现,下面详细的介绍它的功能以及使用方法. ...

  8. Java实现split字符串分割方法

    实现方法 split, 能够指定分割符将字符串拆分成字符串数组 思路如下: 统计字符串中的目标分割符的个数. 创建字符串数组并将其初始化为 "",不初始化的话字符串数组中就会是nu ...

  9. JS 学习笔记(一)常用的字符串去重方法

    要求:从输入框中输入一串字符,按回车后输出去重后的字符串 方法一: <body><input type="text" id="input" p ...

  10. 常用的字符串截取方法

    字符串截取: 1 取字符串的前i个字符str=str.substring(0,i);2 去掉字符串的前i个字符str=str.substring(i); 3 从右边开始取i个字符str=str.sub ...

最新文章

  1. ScrollView的使用
  2. hdu1395 2^x mod n = 1
  3. 【一周入门MySQL—4】数据库进阶练习
  4. Linux基础(day59)
  5. 如何使用SAP C4C Repository Explorer里的BO test shell
  6. 数据结构与算法--字符串的排列组合问题
  7. 9.2-控制单元CU的功能(学习笔记)
  8. ros indigo 学习笔记
  9. qscoj:喵哈哈村的卢西奥
  10. 解决了!联邦学习+推荐系统,冷启动和数据隐私问题双双K.O
  11. 各个版本的sqlite-jdbc jar下载链接
  12. centos中service命令与/etc/init.d的关系以及centos7的变化
  13. canvas简易人机五子棋
  14. HandlerSocket
  15. 输入若干数据,找出最大值输出。(键盘和文件读取)
  16. 【每日新闻早报】9月17日 星期二
  17. unity学习笔记-实现版本更新
  18. Android 类似未读短信图标显示数字效果的分析
  19. 计算机冗余,惯性导航计算机系统冗余设计
  20. java英语面试自我介绍_java面试英语自我介绍范文

热门文章

  1. 最近运气不好。很不爽!!!!!
  2. MySql 存储过程 退出
  3. Lyndon Word学习笔记
  4. idea关于mybatis去除黄色背景色与绿色背景
  5. 5.MySQL优化---索引优化专题
  6. 设计模式 AOP 面向切入编程
  7. 执行pip命令时遇到 Fatal error in launcher: Unable to create process using ''
  8. 通过源码成功启动odoo 10.0
  9. PHP------- 继承
  10. ognl概念和原理详解