zoukankan      html  css  js  c++  java
  • 常用的字符串分割方法

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

    当然,如果你觉得自己的字符串处理可以做的很好,可以考虑直接使用字符串查找函数做字符串分割,比如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 初始化失败
    "));
    		nRetCode = 1;
    	}
    	else
    	{
    		// TODO: 在此处为应用程序的行为编写代码。
    		char source[] = "123
    
    456
    789";
    		char token = '
    ';
    		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”。

  • 相关阅读:
    API网络数据安全
    【值得收藏】一文掌握用户画像系统构建全流程
    手把手教你从0到1学会tensorflow进行模型训练,并能在网页轻松运行
    APP选择第三方消息推送平台时,有哪些需要关注的重要性能指标?
    如何防薅羊毛?个推基于大数据风控引擎助力APP反欺诈!
    微信为什么要搞一个小游戏?
    关于 JS 模块化的最佳实践总结
    张小龙2019微信公开课15个看点总结
    编程:从前有一个傻呆程序员,老婆交给他一项任务,他办了四次才满意
    JS是如何计算 1+1=2 的?
  • 原文地址:https://www.cnblogs.com/tocy/p/string_split_function.html
Copyright © 2011-2022 走看看