C语言实现split()函数:字符串分割

C语言实现split函数:字符串分割

Python中有split()函数,觉得很好用,但在C语言的标准库下却没有,只好手动实现了

代码如下

/*
 * 函数: split()
 * 功能: 指定分隔符分割字符串
 * 返回值: 一个指向包含char*指针的数组的指针,即char **pt
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char **split(const char *source, char flag);

int main()
{
    char str1[] = " abs   mk  oi pp";
    char str2[] = "*hello, world*";
    char **p1, **p2;
    p1 = split(str1, ' ');

    for (int i = 0; p1[i] != NULL; i++)
        printf("p1[%d] = %s\n", i, p1[i]);
    putchar('\n');

    p2 = split(str2, '*');
    for (int i = 0; p2[i] != NULL; i++)
        printf("p2[%d] = %s\n", i, p2[i]);
    // 释放内存
    free(p2);
    free(p1);
    return 0;
}


char **split(const char *source, char flag)
{
    char **pt;
    int j, n = 0;
    int count = 1;
    int len = strlen(source);
    // 动态分配一个 *tmp,静态的话,变量len无法用于下标
    char *tmp = (char*)malloc((len + 1) * sizeof(char));
    tmp[0] = '\0';

    for (int i = 0; i < len; ++i)
    {
        if (source[i] == flag && source[i+1] == '\0')
            continue;
        else if (source[i] == flag && source[i+1] != flag)
            count++;
    }
    // 多分配一个char*,是为了设置结束标志
    pt = (char**)malloc((count+1) * sizeof(char*));

    count = 0;
    for (int i = 0; i < len; ++i)
    {
        if (i == len - 1 && source[i] != flag)
        {
            tmp[n++] = source[i];
            tmp[n] = '\0';  // 字符串末尾添加空字符
            j = strlen(tmp) + 1;
            pt[count] = (char*)malloc(j * sizeof(char));
            strcpy(pt[count++], tmp);
        }
        else if (source[i] == flag)
        {
            j = strlen(tmp);
            if (j != 0)
            {
                tmp[n] = '\0';  // 字符串末尾添加空字符
                pt[count] = (char*)malloc((j+1) * sizeof(char));
                strcpy(pt[count++], tmp);
                // 重置tmp
                n = 0;
                tmp[0] = '\0';
            }
        }
        else
            tmp[n++] = source[i];
    }
    
    // 释放tmp
	free(tmp);
	
    // 设置结束标志
    pt[count] = NULL;

    return pt;
}

运行结果

运行结果

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琼觞0543

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值