文档章节

常用的字符串分割方法

Tocy
 Tocy
发布于 2015/09/09 22:15
字数 781
阅读 10
收藏 0

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

当然,如果你觉得自己的字符串处理可以做的很好,可以考虑直接使用字符串查找函数做字符串分割,比如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”。

© 著作权归作者所有

Tocy
粉丝 29
博文 50
码字总数 59635
作品 0
海淀
程序员
私信 提问
Python入门(十四) 字符串

Python中的字符串可以是单引号''或者双引号""括起来,如果字符串比较长,需要垮行,可以使用三引号''' ''' errHtml = '''<HTML><HEAD><TITLE>Python CGI Demo</TITLE></HEAD><BODY><H3>ERROR......

kaedehao
2015/08/19
51
0
用原始方法解析复杂字符串,json一定要用JsonMapper么?

阅读目录 1.不规则非json字符串 2.键值对字符串分割函数 3.复杂Json格式的字符串 4.标准的json格式 5.总结 经常采集数据,肯定会碰到解析字符串,包括整个页面的html,或者json以及一些不标准...

老朱第八
2017/11/11
0
0
【秘籍总结】玩转Python里的字符串|上篇

这是菜鸟学Python的第108篇原创文章 阅读本文大概需要2分钟 目前累计已经写了100多篇,写了小白入门篇,爬虫数据库篇,以及数据可视化分析.洋洋洒洒,越写越多.下一个阶段我准备开始写机器学习...

菜鸟学python
2017/10/31
0
0
Java——常用类(String)

【常用类】 <1>字符串相关类(String、StringBuffer) <2>基本数据类型包装类 <3>Math类 <4>File类 <5>枚举类 【String类】 <1>java.lang.String类代表不可变的字符序列。 <2>String类的常见......

野渡书生
2016/03/11
8
0
浅析正则表达式模式匹配的 String 方法

在JavaScript代码中使用正则表达式进行模式匹配经常会用到String对象和RegExp对象的一些方法,例如replace、match、search等方法,以下是对一些方法使用的总结。 String对象中支持正则表达式...

snowing1990
2016/03/30
20
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
今天
4
0
redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
昨天
4
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
昨天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部