常用的字符串分割方法

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

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

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

CString::Tokenize)

用法如下。

// 按照token分割source字符串,结果通过cout输出
// 使用MFC的CString::Tokenize
void SplitUseTokenizeconst char * source, char token)
{

	CString strSource = source;
	CString strTokentoken);

	int pos = 0;
		
	while -1 != pos)
	{
		CString strCur = strSource.TokenizestrToken, pos);

		if !strCur.IsEmpty))
		{
			cout << strCur << endl;
		}
	}

	cout << endl << endl;
}

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

AfxExtractSubString)函数

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

	cout << endl << endl;
}

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

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

c语言的strtok)函数

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

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

这里需要说明的是:

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

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

另外有一点要注意:

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

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

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

int _tmainint argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	// 初始化 MFC 并在失败时显示错误
	if !AfxWinInit::GetModuleHandleNULL), NULL, ::GetCommandLine), 0))
	{
		// TODO: 更改错误代码以符合您的需要
		_tprintf_T"错误: MFC 初始化失败
"));
		nRetCode = 1;
	}
	else
	{
		// TODO: 在此处为应用程序的行为编写代码。
		char source[] = "123

456
789";
		char token = '
';
		SplitUseTokenizesource, token);
		SplitUseExtractsource, token);
		SplitUseStrtoksource, token);

		system"pause");
	}

	return nRetCode;
}

  

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

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

Published by

风君子

独自遨游何稽首 揭天掀地慰生平