中文字符串分割c语言,[C语言]字符串处理 - 以指定的字符串分割字符串(支持中文字符)...

本文介绍了两种C语言实现字符串分割的方法,包括将字符串按指定分隔符拆分成数组并记录子字符串数量的方案1,以及使用结构体和计数器的方案2。通过实例展示了如何使用和测试这两种方案,并讨论了它们在内存管理和效率上的特点。
摘要由CSDN通过智能技术生成

/*C代码如下*/

#include /*实现方案1*/

/*分割字符串到一个字符串数组中,其中该数组第一位为分割后的个数*/

char** StringSplit(const char* string,const char* split)

{

char** result;

/*首先分配一个char*的内存,然后再动态分配剩下的内存*/

result = (char * * )malloc(sizeof(char *)*1);

memset(result,0,sizeof(char *)*1);

/*定义一个遍历用的指针和一个寻找位置用的指针*/

char* p = string;

char* pos = string;

/*无论是否存在该分割串,绝对都会分割到一个字符串*/

int count = 1;

while(*p != '\0')

{

char* temp;

char* tt;

/*查找该字符串*/

pos = strstr(p,split);

/*结果为0说明剩下的字符串中没有该字符了*/

if(pos == 0)

{

result = (char * * )realloc(result,sizeof(char *)*(count+2));

result[0] = count;

result[count] = p;

result[count+1] = NULL;

return result;

}

/*分配临时字符串空间*/

temp = (char * )malloc(sizeof(char)*(pos - p+1));

memset(temp,0,sizeof(char)*(pos - p+1));

/*设置头指针,以便赋值时使用*/

tt = temp;

while(p<=pos)

{

*temp++ = *p++;

}

/*将字符串结尾置零*/

*--temp = '\0';

result = (char * * )realloc(result,sizeof(char *)*(count+1));

result[0] = count;

result[count] = tt;

count++;

/*设置下一次遍历时的指针(重要)。当split长度大于1时,不这样设置会多赋值不必要的字符串*/

p +=strlen(split)-1;

}

return result;

}

/*实现方案2*/

/*为方便计数定义的结构,字符串数组从0开始赋值*/

typedef struct{

int number;         /*分割的字符串个数*/

char** string;         /*字符串数组*/

}StringTab;

/*分割字符串到一个字符串数组中*/

StringTab StringSplit_Struct(const char* string,const char* split)

{

StringTab result;

/*首先分配一个char*的内存,然后再动态分配剩下的内存*/

result.string = (char * * )malloc(sizeof(char *)*1);

memset(result.string,0,sizeof(char *)*1);

/*无论是否存在该分割串,绝对都会分割到一个字符串*/

result.number = 0;

/*定义一个遍历用的指针和一个寻找位置用的指针*/

char* p = string;

char* pos = string;

while(*p != '\0')

{

char* temp;

char* tt;

/*查找该字符串*/

pos = strstr(p,split);

/*结果为0说明剩下的字符串中没有该字符了*/

if(pos == 0)

{

result.string = (char * * )realloc(result.string,sizeof(char *)*(result.number+1));

result.string[result.number] = p;

return result;

}

/*分配临时字符串空间*/

temp = (char * )malloc(sizeof(char)*(pos - p+1));

memset(temp,0,sizeof(char)*(pos - p+1));

/*设置头指针,以便赋值时使用*/

tt = temp;

while(p<=pos)

{

*temp++ = *p++;

}

/*将字符串结尾置零*/

*--temp = '\0';

result.string = (char * * )realloc(result.string,sizeof(char *)*(result.number+1));

result.string[result.number] = tt;

/*计数器加一*/

result.number++;

/*设置下一次遍历时的指针(重要)。当split长度大于1时,不这样设置会多赋值不必要的字符串*/

p +=strlen(split)-1;

}

return result;

}

int main()

{

/*进行测试*/

/*方案1测试*/

char** array;

array = StringSplit("a/aaa//哈aa","aaa");

int i ;

for(i=1;i<=(int)array[0];i++)

{

printf("Num:%d I:%d: Value: %s\n",array[0],i,array[i]);

}

array = StringSplit("a/aa哈a//哈aa","哈");

for(i=1;i<=(int)array[0];i++)

{

printf("Num:%d I:%d: Value: %s\n",array[0],i,array[i]);

}

/*方案2测试*/

StringTab array2;

array2 = StringSplit_Struct("a/aaa//哈aa","aaa");

for(i=0;i<=array2.number;i++)

{

printf("Num:%d I:%d: Value: %s\n",array2.number,i,array2.string[i]);

}

array2 = StringSplit_Struct("a/aa哈a//哈aa","哈");

for(i=0;i<=array2.number;i++)

{

printf("Num:%d I:%d: Value: %s\n",array2.number,i,array2.string[i]);

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值