• 字符串分割方法代码


    一、需求:把字符串按照给定拆分符(字符或字符串)拆分开:

    例如:

     a.字符拆分:

     a1:  1001,ziweiyi,abcd  (末尾无拆分符)  按照' ,'拆分开成:1001  ziweiyi  abcd

     a2:  1001,ziweiyi,abcd, (末尾有拆分符)  按照' ,'拆分开成:1001  ziweiyi  abcd

     b.字符串拆分:

     b1:  1001brziweiyibrabcd    (末尾无拆分符)  按照“br”拆分开成:1001  ziweiyi  abcd

     b2:  1001brziweiyibrabcdbr (末尾有拆分符)  按照“ br”拆分开成:1001  ziweiyi  abcd

    二、上代码:这里提供两个可用拆分函数,请根据字喜好选择使用

    方法一:

     1 void SplitString(char* src,const char* separator, vector<string>& destVector)
     2 {
     3 
     4     destVector.clear();
     5     if(0==strlen(separator))
     6     {
     7         destVector.push_back(string(src));
     8         return ;
     9     }
    10 
    11     char *first,*second;
    12     char tmp[50];
    13     first = src;
    14     while(first)
    15     {
    16         memset(tmp,'\0',sizeof(tmp));
    17         second = strstr(first,separator);
    18         if (NULL==second)
    19         {
    20             strncpy(tmp,first,strlen(src));
    21         }
    22         else
    23         {
    24             strncpy(tmp,first,second-first);
    25         }
    26 
    27         if (strlen(tmp)!=0)
    28         {
    29             destVector.push_back(string(tmp));
    30         }
    31         first = second +strlen(separator);
    32 
    33         if (NULL==second)
    34             break;
    35     }
    36 
    37 }

     方法二:

     1 int SplitString(const string src, string separator, vector<string>& destVector)
     2 {
     3     string temp, SrcTemp;
     4     int nPos = 0, nResultCount = 0;
     5     bool bAddEmpty = false;
     6     destVector.clear();
     7     SrcTemp = src;
     8 
     9     if(separator.empty())
    10     {
    11         destVector.push_back(SrcTemp);
    12         return 1;
    13     }
    14 
    15     do
    16     {
    17         nPos = SrcTemp.find(separator);
    18 
    19         if(nPos != string::npos)
    20         {
    21             if(nPos == 0)
    22             {
    23                 SrcTemp = SrcTemp.substr(nPos + separator.length(),
    24                     SrcTemp.length() - nPos - separator.length());
    25                 continue;
    26             }
    27             else if(nPos > 0)
    28             {
    29                 temp = SrcTemp.substr(0, nPos);
    30 
    31                 SrcTemp = SrcTemp.substr(nPos + separator.length(),
    32                     SrcTemp.length() - nPos - separator.length());
    33                 if (temp.length() > 0)
    34                 {
    35                     destVector.push_back(temp);
    36                     nResultCount++;
    37                 }
    38                 else if (bAddEmpty)
    39                 {
    40                     destVector.push_back(temp);
    41                     nResultCount++;
    42                 }
    43 
    44             }
    45         }
    46         else
    47         {
    48             if(nResultCount == 0)
    49             {
    50                 if (SrcTemp.length() > 0)
    51                 {
    52                     destVector.push_back(SrcTemp);
    53                     nResultCount++;
    54                 }
    55                 else if (bAddEmpty)
    56                 {
    57                     destVector.push_back(SrcTemp);
    58                     nResultCount++;
    59                 }
    60                 SrcTemp = "";
    61             }
    62             else if(nResultCount > 0)
    63             {
    64                 if (SrcTemp.length() > 0)
    65                 {
    66                     destVector.push_back(SrcTemp);
    67                     nResultCount++;
    68                 }
    69                 else if (bAddEmpty)
    70                 {
    71                     destVector.push_back(SrcTemp);
    72                     nResultCount++;
    73                 }
    74                 SrcTemp = "";
    75             }
    76             else
    77                 return -1;
    78         }
    79     } while(!SrcTemp.empty());
    80 
    81     return nResultCount;
    82 }

    三、测试main

     1 void main()
     2 {
     3     vector<string> vecTar;
     4     char szSrc[]="1001,ziweiyi,abcd";
     5     SplitString(szSrc, ",", vecTar);//方法一
     6     for (int i = 0; i < vecTar.size();i ++)
     7     {
     8         printf("【%s】 SplitString: %s\n",szSrc,vecTar[i].c_str());
     9     }
    10     printf("方法1,end.\n\n");
    11 
    12     string strSrc="1001,ziweiyi,abcd";
    13     int nRet = SplitString(strSrc, ",", vecTar);//方法二
    14     for (int i = 0; i < nRet;i ++)
    15     {
    16         printf("【%s】 SplitString: %s\n",strSrc.c_str(),vecTar[i].c_str());
    17     }
    18     printf("方法2,end.\n\n");
    19 
    20 }

    这里指给出了最常见的案例(需求a1的情况),其他的可以自己测试,本人已测试过。

    贴出测试效果,更明白:

       a1:  1001,ziweiyi,abcd  (末尾无拆分符)  按照' ,'拆分开成:1001  ziweiyi  abcd

       

     a2:  1001,ziweiyi,abcd(末尾有拆分符)  按照' ,'拆分开成:1001  ziweiyi  abcd

       

     b.字符串拆分:

     b1:  1001brziweiyibrabcd    (末尾无拆分符)  按照“br”拆分开成:1001  ziweiyi  abcd

       

     b2:  1001brziweiyibrabcdbr (末尾有拆分符)  按照“ br”拆分开成:1001  ziweiyi  abcd

       

    欢迎大家分享其他的方法,共同学习!

  • 相关阅读:
    JavaScript中的事件循环
    CSS布局
    Tomcat相关
    C#参数中ref和out的区别
    angular启动4200端口后,如何停止监听4200端口
    表联接(交叉连接,内联,外联)
    如何使用vs自带的反编译工具Lldasm
    软件架构需要注意的几点,待补充。。。
    SqlServer中With(NOLOCK)
    TypeScript preview
  • 原文地址:https://www.cnblogs.com/alylee/p/SplitStringByToken.html
Copyright © 2020-2023  润新知