|
【原创】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>
|
一派护法 十九级 |
|