目前共有8篇帖子。 內容轉換:不轉換▼
 
點擊 回復
383 7
【原创】C语言版本的explode函数(字符串分割为数组的函数)(单字符分隔符版)
一派護法 十九級
1樓 發表于:2015-11-21 19:56

#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;
}
一派護法 十九級
2樓 發表于:2015-11-21 19:57

运行结果:
List:
linux
apache
mysql
php
IIS
Microsoft Access
SQL Server

The second string is: apache
一派護法 十九級
3樓 發表于:2015-11-21 20:04

补充一个求字符串数组大小的函数(也就是求出一个字符串数组中有多少个字符串):
int strarrlen(char **array)
{
    int len = 0;
    while (*array != NULL)
    {
        len++;
        array++;
    }
    return len;
}
一派護法 十九級
5樓 發表于:2015-11-21 20:07

空字符串测试:
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
正常。
一派護法 十九級
6樓 發表于:2015-11-21 20:07

单元素测试:
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
正常。
一派護法 十九級
7樓 發表于:2015-11-21 20:09

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
一派護法 十九級
8樓 發表于:2015-11-21 20:10

回復:7樓

注意,使用strlen这个函数需要包含头文件#include <string.h>

一派護法 十九級
9樓 發表于:2015-11-21 20:56

对应的join函数请参阅:https://zh.arslanbar.net/post.php?t=23428

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:383 回複數:7
評論數: ?
作者: 巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2015-11-21 20:56
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。