C语言实现Split函数

借助C语言的动态内存分配,实现类似VB中Split函数的效果。

结构体介绍:

IString:

参数 str:字符串数组的指针

参数 num:字符串个数

函数介绍:

功能:按一个字符来拆分字符串

参数  src:要拆分的字符串
参数  delim:按照这个字符来拆分字符串
参数  istr:借助这个结构体来返回给调用者拆分后的字符串数组和字符串的个数
返回拆分是否成功


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char **str;     //the PChar of string array
    size_t num;     //the number of string
}IString;


/** \Split string by a char
 *
 * \param  src:the string that you want to split
 * \param  delim:split string by this char
 * \param  istr:a srtuct to save string-array's PChar and string's amount.
 * \return  whether or not to split string successfully
 *
 */
int Split(char *src, char *delim, IString* istr)//split buf
{
    int i;
    char *str = NULL, *p = NULL;

    (*istr).num = 1;
	str = (char*)calloc(strlen(src)+1,sizeof(char));
	if (str == NULL) return 0;
    (*istr).str = (char**)calloc(1,sizeof(char *));
    if ((*istr).str == NULL) return 0;
    strcpy(str,src);

	p = strtok(str, delim);
	(*istr).str[0] = (char*)calloc(strlen(p)+1,sizeof(char));
	if ((*istr).str[0] == NULL) return 0;
 	strcpy((*istr).str[0],p);
	for(i=1; p = strtok(NULL, delim); i++)
    {
        (*istr).num++;
        (*istr).str = (char**)realloc((*istr).str,(i+1)*sizeof(char *));
        if ((*istr).str == NULL) return 0;
        (*istr).str[i] = (char*)calloc(strlen(p)+1,sizeof(char));
        if ((*istr).str[0] == NULL) return 0;
        strcpy((*istr).str[i],p);
    }
    free(str);
    str = p = NULL;

    return 1;
}

int main()
{
    int i;
    char s[]="data0|data1|data2|data3|data4|data5|data6|data7|data8";
    IString istr;

    if (  Split(s,"|",&istr) )
    {
        for (i=0;i<istr.num;i++)
            printf("%s\n",istr.str[i]);
        //when you don't ues it,you must to free memory.
        for (i=0;i<istr.num;i++)
            free(istr.str[i]);
        free(istr.str);
    }
    else
        printf("memory allocation failure!\n");


    system("pause");
    return 0;
}




运行结果:

data0
data1
data2
data3
data4
data5
data6
data7
data8

注意:

IString使用完之后要记住释放内存

for (i=0;i<istr.num;i++)

       free(istr.str[i]);

free(istr.str);

 

 

 

 

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
函数 语法 功能 Len Len(string|varname) 返回字符串内字符的数目,或是存储一变量所需的字节数。 Trim Trim(string) 将字符串前后的空格去掉 Ltrim Ltrim(string) 将字符串前面的空格去掉 Rtrim Rtrim(string) 将字符串后面的空格去掉 Mid Mid(string,start,length) 从string字符串的start字符开始取得length长度的字符串,如果省略第三个参数表示从start字符开始到字符串结尾的字符串 Left Left(string,length) 从string字符串的左边取得length长度的字符串 Right Right(string,length) 从string字符串的右边取得length长度的字符串 LCase LCase(string) 将string字符串里的所有大写字母转化为小写字母 UCase UCase(string) 将string字符串里的所有大写字母转化为大写字母 StrComp StrComp(string1,string2[,compare]) 返回string1字符串与string2字符串的比较结果,如果两个字符串相同,则返回0,如果小于则返回-1,如果大于则返回1 InStr InStr(string1,string2[,compare]) 返回string1字符串在string2字符串中第一次出现的位置 Split Split(string1,delimiter[,count[,start]]) 将字符串根据delimiter拆分成一维数组,其中delimiter用于标识子字符串界限。如果省略,使用空格("")作为分隔符。count返回的子字符串数目,-1指示返回所有子字符串。start为1执行文本比较;如果为0或者省略执行二进制比较。 Replace Replace(expression,find,replacewith[,compare[,count[,start]]]) 返回字符串,其中指定数目的某子字符串(find)被替换为另一个子字符串(replacewith)。
C语言中没有内置的split函数,但你可以使用一些字符串处理函数实现类似的功能。以下是一个简单的示例代码,展示了如何使用strtok函数进行字符串分割: ```c #include <stdio.h> #include <string.h> int main() { char str[] = "Hello, World! This is a string."; char delimiters[] = " ,.!"; // 分割字符集合 char *token = strtok(str, delimiters); // 第一次调用strtok函数 while (token != NULL) { printf("%s\n", token); token = strtok(NULL, delimiters); // 后续调用strtok函数 } return 0; } ``` 在上面的示例代码中,我们首先声明一个字符串 `str`,它包含要分割的内容。然后声明一个字符串 `delimiters`,其中包含用于分割的字符集合。我们将str传递给`strtok`函数,它会根据 `delimiters` 中的字符将str分割成多个子字符串。第一次调用`strtok`函数时,传递的参数是需要分割字符串 `str`;后续调用时,传递的参数是NULL,以便继续使用之前分割字符串进行分割。每次调用`strtok`函数会返回一个指向下一个子字符串的指针,直到返回NULL为止。 上述代码的输出结果将是: ``` Hello World This is a string ``` 请注意,`strtok`函数会修改原始字符串,将分隔符替换为'\0'作为子字符串的结束标志。如果你不想修改原始字符串,可以使用其他方法来实现字符串分割,例如使用自定义的分割函数或者使用正则表达式库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值