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

好久没写过C语言,感觉指针、动态分配空间什么的都忘完了

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	void split(char *str,const char *ch,char ***args,int *size);
	char **args;
	char str[]={"abc def ghi"};
	int i=0;
	int size;
	split(str," ",&args,&size);
	for(i=0;i<size;i++)
	{
		printf("%s\n",args[i]);
	}
	return 0;
 } 
 void split(char *str,const char *ch,char ***args,int *size)
 {
 	int i=0,word=0,sum=0;
 	for(;str[i]!='\0';i++)
 	{
 		if(str[i]==ch[0])
 		word=0;
 		else if(word==0)
 		{
 			word=1;
 			sum++;
		 }
	 }
	 if(sum==0)
	 return;
	 *size=sum;
	 *args=(char**)malloc(sizeof(char*)*sum);
	 char *s;
	 s=(char*)strtok(str,ch);//strtok(char *string,const char *str)返回string中str所分解的第一个字符串
	 i=0;
	 while(s!=NULL)
	 {
	 	(*args)[i]=s;
	 	s=(char*)strtok(NULL,ch);//为什么用NULL不太清楚,别人都这么用。
	 	i++;
	 }

 }

结果

abc
def
ghi

几个要注意的点

  • 为了动态的判断拆分后的字符串个数并分配空间在主函数中仅定义了指向字符数组的指针,而没有分配空间
  • 在子函数中改变参数的值必须传地址,所以split的第三个参数为char ***args,传实参时传指向字符数组指针的地址&args
  • 子函数中使用数组的地址为数组某个下标赋值要将 * 和 数组名 扩起来,如上面代码中的(*args)[i]

版权声明:本文为lightYear12138原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。