|
【原創】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>
|
|
一派掌門 二十級 |
|
|