作者共发了8篇帖子。 内容转换:不转换▼
 
点击 回复
530 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)
 

本帖信息

点击数:530 回复数:7
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2015-11-21 20:56
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。