|  | 【原创】C语言版本的explode函数(字符串分割为数组的函数)(单字符分隔符版) | 
                
          |   一派护法 十九级 | 
              #include <stdio.h>#include <stdlib.h>
 
 char **explode(char delimiter, char *pStr)
 {
 int n = 0;
 char *pStrStart = pStr;
 char **array;
 int i, j, len;
 
 if (*pStr != '\0')
 n++;
 while (*pStr != '\0')
 {
 if (*pStr == delimiter)
 n++;
 *pStr++;
 }
 pStr = pStrStart;
 
 array = (char **)malloc((n + 1) * sizeof(char *));
 for (i = 0; i < n; i++)
 {
 len = 0;
 pStrStart = pStr;
 while (*pStr != delimiter && *pStr != '\0')
 {
 len++;
 pStr++;
 }
 pStr = pStrStart;
 array[i] = (char *)malloc((len + 1) * sizeof(char));
 for (j = 0; j < len; j++)
 {
 array[i][j] = *pStr;
 pStr++;
 }
 pStr++; // jump over the delimiter
 array[i][len] = '\0';
 }
 array[n] = NULL;
 return array;
 }
 
 void strarrfree(char **array)
 {
 char **pArray = array;
 while (*array != NULL)
 {
 free(*array);
 array++;
 }
 free(pArray);
 }
 
 void strarrprint(char **array)
 {
 while (*array != NULL)
 {
 puts(*array);
 array++;
 }
 }
 
 int main()
 {
 char *str = "linux,apache,mysql,php,IIS,Microsoft Access,SQL Server";
 char **strarr = explode(',', str);
 puts("List:");
 strarrprint(strarr);
 printf("\nThe second string is: %s\n", strarr[1]);
 strarrfree(strarr);
 return 0;
 }
 | 
                
          |   一派护法 十九级 | 
              运行结果:List:
 linux
 apache
 mysql
 php
 IIS
 Microsoft Access
 SQL Server
 
 The second string is: apache
 
 | 
                
          |   一派护法 十九级 | 
              补充一个求字符串数组大小的函数(也就是求出一个字符串数组中有多少个字符串):int strarrlen(char **array)
 {
 int len = 0;
 while (*array != NULL)
 {
 len++;
 array++;
 }
 return len;
 }
 
 | 
                
          |   一派护法 十九级 | 
              空字符串测试:int main()
 {
 char str[] = "";
 char **strarr = explode(',', str);
 strarrprint(strarr); // nothing done
 printf("Array length: %d\n", strarrlen(strarr));
 strarrfree(strarr);
 return 0;
 }
 输出:
 Array length: 0
 正常。
 | 
                
          |   一派护法 十九级 | 
              单元素测试:int main()
 {
 char str[] = "My Documents";
 char **strarr = explode(',', str);
 strarrprint(strarr); // nothing done
 printf("Array length: %d\n", strarrlen(strarr));
 strarrfree(strarr);
 return 0;
 }
 输出:
 My Documents
 Array length: 1
 正常。
 
 | 
                
          |   一派护法 十九级 | 
              strarrlen和strlen函数的使用:int main()
 {
 char str[] = "Windows,kUbuntu,Fedora,CentOS,ArchLinux,Gentoo";
 char **strarr = explode(',', str);
 int i, len;
 strarrprint(strarr);
 printf("\nArray length: %d\n", strarrlen(strarr));
 len = strarrlen(strarr);
 for (i = 0; i < len; i++)
 printf("strlen(\"%s\") = %d\n", strarr[i], strlen(strarr[i]));
 strarrfree(strarr);
 return 0;
 }
 输出:
 Windows
 kUbuntu
 Fedora
 CentOS
 ArchLinux
 Gentoo
 
 Array length: 6
 strlen("Windows") = 7
 strlen("kUbuntu") = 7
 strlen("Fedora") = 6
 strlen("CentOS") = 6
 strlen("ArchLinux") = 9
 strlen("Gentoo") = 6
 
 | 
                
          |   一派护法 十九级 | 
              回復:7樓 注意,使用strlen这个函数需要包含头文件#include <string.h>
 | 
                
          |   一派护法 十九级 |  |