打印

分享个explode程序

[复制链接]
3503|46
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
biechedan|  楼主 | 2013-6-22 23:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "explode.h"

struct array *explode(char *string, char *separator, int copy) {
    int i, len, seplen;
    char *ptr;
    struct array *array;
    int slots = 5;
    int elems = 1;

    len = strlen(string);
    seplen = strlen(separator);

    array = malloc(sizeof(struct array));
    if (!array) {
        return NULL;
    }

    array->size   = 0;
    array->vector = (char **)malloc(sizeof(char *) * slots);
    if (!array->vector) {
        free(array);
        return NULL;
    }

    if (copy) {
        array->copy = ISCOPY;
        array->slot = (char *)malloc(len + 1);
        if (!array->slot) {
            free(array->vector);
            free(array);
            return NULL;
        }
        memcpy(array->slot, string, len);
        array->slot[len] = 0;
    } else {
        array->copy = NOCOPY;
        array->slot = string;
    }

    ArrayElem(array, 0) = array->slot;
    ptr = array->slot;

    for (i = 0; i < (len - seplen + 1);) {
        if (memcmp(ptr + i, separator, seplen) == 0) {
            elems++;
            if (elems >= slots) {
                char **tmp;

                slots = slots * 2;
                tmp = (char **)realloc(array->vector, sizeof(char *) * slots);
                if (tmp) {
                    array->vector = tmp;
                } else {
                    free(array->slot);
                    free(array->vector);
                    free(array);
                    return NULL;
                }
            }

            memset(ptr + i, 0, seplen);
            ArrayElem(array, ++array->size) = ptr + i + seplen;
            i += seplen;

        } else {
            i++;
        }
    }

    array->size++;
    return array;
}

void array_free(struct array *array) {
    if (array->copy == ISCOPY) {
        free(array->slot);
    }
    free(array->vector);
    free(array);
}

#define TEST
#ifdef  TEST
int main() {
    struct array *array;
    int i;

    array = explode("Hello\r\nWorld\r\nAnd\r\nHello\r\nLiexusong\r\n", "\r\n", ISCOPY);
    printf("array size is: %d\n", ArraySize(array));

    for (i = 0; i < ArraySize(array); i++) {
        printf("array[%d] = %s\n", i, ArrayElem(array, i));
    }

    array_free(array);

    return 0;
}
#endif


相关帖子

沙发
biechedan|  楼主 | 2013-6-22 23:01 | 只看该作者
#ifndef EXPLODE_H
#define EXPLODE_H

struct array {
    int size;
    unsigned char copy;
    char *slot;
    char **vector;
};

#define ArraySize(array) ((array)->size)
#define ArrayElem(array, i) ((array)->vector[i])

#define ISCOPY 1
#define NOCOPY 0

struct array *explode(char *string, char *separator, int copy);
void array_free(struct array *array);

#endif


使用特权

评论回复
板凳
biechedan|  楼主 | 2013-6-22 23:01 | 只看该作者
运行结果是:
array size is: 6
array[0] = Hello
array[1] = World
array[2] = And
array[3] = Hello
array[4] = Liexusong
array[5] =

使用特权

评论回复
地板
biechedan|  楼主 | 2013-6-22 23:01 | 只看该作者
这个是分割字符串的比较好的一个用法

使用特权

评论回复
5
51xlf| | 2013-6-22 23:22 | 只看该作者
不错,是个php学的吧?

使用特权

评论回复
6
biechedan|  楼主 | 2013-6-22 23:23 | 只看该作者
51xlf 发表于 2013-6-22 23:22
不错,是个php学的吧?

是的,然后找到别人分享的。

使用特权

评论回复
7
51xlf| | 2013-6-22 23:24 | 只看该作者
biechedan 发表于 2013-6-22 23:23
是的,然后找到别人分享的。

这个就是把字符串转换为数组的!

使用特权

评论回复
8
zhangmangui| | 2013-6-23 00:17 | 只看该作者
很好   感谢分享

使用特权

评论回复
9
biechedan|  楼主 | 2013-6-23 00:55 | 只看该作者
zhangmangui 发表于 2013-6-23 00:17
很好   感谢分享

不客气的。

使用特权

评论回复
10
biechedan|  楼主 | 2013-6-23 00:56 | 只看该作者
51xlf 发表于 2013-6-22 23:24
这个就是把字符串转换为数组的!

是的,这个函数还真是不错的。

使用特权

评论回复
11
u880| | 2013-6-23 23:41 | 只看该作者
貌似很有用 多谢了

使用特权

评论回复
12
huigoushang| | 2013-6-24 00:05 | 只看该作者
能直接用吗

使用特权

评论回复
13
G21372| | 2013-6-24 00:12 | 只看该作者
这个。。。干嘛用的啊?

使用特权

评论回复
14
yangguangaisha| | 2013-6-24 00:47 | 只看该作者
这个干吗用的啊

使用特权

评论回复
15
gexingyouxian| | 2013-6-24 00:51 | 只看该作者
多谢分享了楼主

使用特权

评论回复
16
acer4736| | 2013-6-24 23:28 | 只看该作者
请问楼主这个干吗用的

使用特权

评论回复
17
jinpaidianzi| | 2013-6-24 23:56 | 只看该作者
可以学习学习

使用特权

评论回复
18
teabottle| | 2013-6-24 23:58 | 只看该作者
字符串转换为数组的

使用特权

评论回复
19
wangjinlili| | 2013-6-25 00:54 | 只看该作者
收了,楼主辛苦

使用特权

评论回复
20
zhangmangui| | 2013-6-25 17:19 | 只看该作者
u880 发表于 2013-6-23 23:41
貌似很有用 多谢了

确实是很有用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

282

主题

7806

帖子

11

粉丝