C语言实现字符串split

面向对象的语言对于字符串的处理都有split操作,可以方便的将字符串分割。今天我自己用C语言实现了字符串分割将分割结果保存在字符串指针数组中。

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

char** strsplit(char *str, char stok)
{
	char *p = str, *h = str, *item = NULL;
	char **ret = NULL, **index;
	int size = 0;
	while(*p)
	{
		if(*p == stok)
			size++;
		p++;
	}
	ret = (char **)malloc((size+2) * sizeof(char *));
	if(ret == NULL)
		return NULL;
	p = str;
	index = ret;
	while(*p)
	{
		if(*p == stok)
		{
			size = p - h-1;
			item = (char *)malloc((size+1)*sizeof(char));
			if(h == str)
				memcpy(item, h,size+1);
			else
				memcpy(item, h+1,size);
			h = p;
			*index = item;
			index++;
		}
		p++;
	}
	size = p - h-1;
	item = (char *)malloc(size*sizeof(char));
	memcpy(item, h+1,size);
	*index = item;
	*(index + 1) = NULL;
	return ret;
}

上面的函数用malloc函数动态的分配了内存空间,使用完成后需要利用free函数将分配的内存空间释放。所以,在使用上面函数处理字符串后需要将内存空间释放掉。因此,我实现了下面的内存空间释放函数。

void strfreesplitp(char **spl)
{
	char **sp = spl;
	while(*sp)
	{
		sp++;
		free(*(sp-1));
	}
	free(spl);
}

当然,如果给出使用的例子会更加的有利于其他人的参考。接下来就给出一个简单的例子。

int main(int argc, char** argv)
{
	char *str = "aa,bb,cc,dd,ee";
	char **sp = strsplit(str, ',');
	char **index = sp;
	while(*index)
	{
		printf("%s ", *index);
		index++;
	}
	strfreesplitp(sp);
}

无论是函数还是函数使用的例子都用到了许多的指针,对应一些对指针使用不是很熟练的同学可能看的一头雾水。后续我如果有时间会对程序中的指针做出解释。

C语言本身并没有提供字符串split的函数,但可以通过自定义函数实现这个功能。一般来说,实现字符串split需要考虑几个关键点: 1. 分隔符:需要指定字符串的分隔符,一般可以使用空格、逗号、分号等符号作为分隔符。 2. 字符串数组:需要定义一个字符数组来存储分割后的子字符串。 3. 计数器:需要定义一个计数器来记录分割后得到的字符串数量。 4. 循环:需要在循环中逐个读取字符,并根据分隔符将字符分割为子字符串。 以下是一个简单的字符串split函数示例: ```c void split(char* str, char delim, char** result, int* count) { char* p = str; char* start = p; while (*p) { if (*p == delim) { *p = '\0'; result[(*count)++] = start; start = p + 1; } p++; } result[(*count)++] = start; } ``` 这个函数接受三个参数:要分割字符串,分隔符以及存储结果的字符串数组和计数器。在函数内部,先定义了两个指针p和start,分别指向字符串的起始位置和分隔符的位置。然后,在循环里每次读取一个字符,遇到分隔符就将其替换为字符串结束符\0,同时将start指向下一个子字符串的起始位置。最后,将最后一个子字符串添加到结果数组中,并返回结果。 需要注意的是,这个函数假设调用者已经在外部分配了结果数组和计数器,因此在使用前需要先为这两个变量分配空间。另外,由于C语言本身并没有提供字符串类型,因此使用字符串操作时需要特别注意字符串结束符的处理以及字符串的长度问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南波儿万

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

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

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

打赏作者

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

抵扣说明:

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

余额充值