winston 发表于 2012-1-29 09:39:17

C/C++实现js的split函数功能

今天在网上找了一下,发觉有比较多的方法,现在列出来,需要的朋友可以参考一下。
功能最丰富的就是第一种方法了:
1 vector<string> Split(const string& s,const string& match,bool removeEmpty=false,bool fullMatch=false)
2 //参数s为需要肢解的字符串
3 //参数match为肢解匹配字符串
4 //参数removeEmpty为是否删除空字符
5 //参数fullMatch为是否只保留全匹配的字符串
6
7 下面为代码区:
8 #include <string>
9 #include <vector>
10
11 namespace Daniweb
12 {
13   using namespace std;
14
15   typedef string::size_type (string::*find_t)(const string& delim,
16                                                 string::size_type offset) const;
17
18   /// <summary>
19 /// Splits the string s on the given delimiter(s) and
20 /// returns a list of tokens without the delimiter(s)
21 /// </summary>
22 /// <param name=s>The string being split</param>
23 /// <param name=match>The delimiter(s) for splitting</param>
24 /// <param name=removeEmpty>Removes empty tokens from the list</param>
25 /// <param name=fullMatch>
26 /// True if the whole match string is a match, false
27 /// if any character in the match string is a match
28 /// </param>
29 /// <returns>A list of tokens</returns>
30   vector<string> Split(const string& s,
31                        const string& match,
32                        bool removeEmpty=false,
33                        bool fullMatch=false)
34   {
35         vector<string> result;               // return container for tokens
36         string::size_type start = 0,         // starting position for searches
37                           skip = 1;            // positions to skip after a match
38         find_t pfind = &string::find_first_of; // search algorithm for matches
39
40         if (fullMatch)
41         {
42             // use the whole match string as a key
43 // instead of individual characters
44 // skip might be 0. see search loop comments
45             skip = match.length();
46             pfind = &string::find;
47         }
48
49         while (start != string::npos)
50         {
51             // get a complete range
52             string::size_type end = (s.*pfind)(match, start);
53
54             // null strings always match in string::find, but
55 // a skip of 0 causes infinite loops. pretend that
56 // no tokens were found and extract the whole string
57             if (skip == 0) end = string::npos;
58
59             string token = s.substr(start, end - start);
60
61             if (!(removeEmpty && token.empty()))
62             {
63               // extract the token and add it to the result list
64               result.push_back(token);
65             }
66
67             // start the next range
68             if ((start = end) != string::npos) start += skip;
69         }
70
71         return result;
72   }
73 }


第二种方法的功能相对少一点:
1 #include <iostream>
2 #include <string>
3 #include <vector>
4 using namespace std;
5
6 vector<string> splitEx(const string& src, string separate_character)
7 {
8   vector<string> strs;
9   
10   int separate_characterLen = separate_character.size();//分割字符串的长度,这样就可以支持如“,,”多字符串的分隔符
11   int lastPosition = 0,index = -1;
12   while (-1 != (index = src.find(separate_character,lastPosition)))
13   {
14         strs.push_back(src.substr(lastPosition,index - lastPosition));
15         lastPosition = index + separate_characterLen;
16   }
17   string lastString = src.substr(lastPosition);//截取最后一个分隔符后的内容
18   if (!lastString.empty())
19         strs.push_back(lastString);//如果最后一个分隔符后还有内容就入队
20   return strs;
21 }
22
23 int _tmain(int argc, _TCHAR* argv[])
24 {
25   string s = "123,456,789,0,888";
26   string del = ",";
27   vector<string> strs = splitEx(s, del);
28   for ( unsigned int i = 0; i < strs.size(); i++)
29   {
30         cout << strs.c_str() << endl;
31   }
32   return 0;
33 }


第三种方法:
1 #include <iostream>
2 #include <string>
3 #include <vector>
4
5 using namespace std;
6
7 void split(const string& src, const string& separator, vector<string>& dest)
8 {
9   string str = src;
10   string substring;
11   string::size_type start = 0, index;
12
13   do
14   {
15         index = str.find_first_of(separator,start);
16         if (index != string::npos)
17         {   
18             substring = str.substr(start,index-start);
19             dest.push_back(substring);
20             start = str.find_first_not_of(separator,index);
21             if (start == string::npos) return;
22         }
23   }while(index != string::npos);
24   //the last token
25   substring = str.substr(start);
26   dest.push_back(substring);
27 }
28
29
30 int main()
31 {
32   string src = "Accsvr:tcp   -h   127.0.0.1 -p /t 20018   ";
33   vector<string> d, s;
34   vector<string>::iterator p, q;
35   split(src,":",d);
36   for(p=d.begin();p!=d.end();++p)
37   {
38         cout << *p << endl;
39         s.clear();
40         split(*p," /t/n",s);
41         for (q=s.begin();q!=s.end();++q)
42             cout << "/t" << *q << endl;
43   }
44   return 0;
45 }


第四种方法:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 void split(char *src, const char *separator, char **dest, int *num)
6 {
7   char *pNext;
8   int count = 0;
9   if (src == NULL || strlen(src) == 0) return;
10   if (separator == NULL || strlen(separator) == 0) return;
11   pNext = strtok(src,separator);
12   while(pNext != NULL)
13   {
14         *dest++ = pNext;
15         ++count;
16         pNext = strtok(NULL,separator);
17   }
18   *num = count;
19 }
20
21 int main()
22 {
23   char src[] = "Accsvr:tcp-h    127.0.0.1      -p/n    20018";
24   char *dest[128];
25   char *dest2[128];
26   int num = 0, num2 = 0;
27   int i, j;
28
29   split(src,":",dest,&num);
30
31   for (i=0;i<num;++i)
32   {
33         printf("|%s|/n",dest);
34         split(dest," /t/n",dest2,&num2);
35         for (j=0;j<num2;++j)
36         {
37             printf("|%s|/n",dest2);
38         }
39   }
40   return 0;
41 }


第五种方法:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 void split(char *src, const char *separator, char **dest, int *num)
6 {
7   char *pSeparator, *pStart, *pEnd;
8   unsigned int sep_len;
9   int count = 0;
10   
11   if (src == NULL || strlen(src) == 0) return;
12   
13   pSeparator = (char *)malloc(16);
14   if (pSeparator == NULL) return;
15   
16   if (separator == NULL || strlen(separator) == 0) strcpy(pSeparator," ");/* one blank by default */
17   else strcpy(pSeparator,separator);
18
19   sep_len = strlen(pSeparator);
20         
21   pStart = src;
22   
23   while(1)
24   {
25         pEnd = strstr(pStart, pSeparator);
26         if (pEnd != NULL)
27         {
28             memset(pEnd,'/0',sep_len);
29             *dest++ = pStart;
30             pEnd = pEnd + sep_len;
31             pStart = pEnd;
32             ++count;
33         }
34         else
35         {
36             *dest = pStart;
37             ++count;
38             break;
39         }
40   }
41   *num = count;
42   if (pSeparator != NULL) free(pSeparator);
43 }
44
45 int main()
46 {
47   char src[] = "Accsvr:tcp-h    127.0.0.1    -p    20018";
48   char *dest[128];
49   char *dest2[128];
50   int num = 0, num2 = 0;
51   int i, j;
52
53   split(src,":",dest,&num);
54
55   for (i=0;i<num;++i)
56   {
57         printf("|%s|/n",dest);
58         split(dest,"/t",dest2,&num2);
59         for (j=0;j<num2;++j)
60         {
61             printf("|%s|/n",dest2);
62         }
63   }
64   return 0;
65 }


http://www.cnblogs.com/jackson-leung/aggbug/2330713.html?type=1本文链接

页: [1]
查看完整版本: C/C++实现js的split函数功能