嵌入式C语言 - 字符串分割和字符串截取

有关字符串相关注意事项,可参考下面博文复习

  • https://blog.csdn.net/ReCclay/article/details/104016287

以下代码需要注意的是,字符数组可以直接改变单个字符,而字符指针不能直接改变单个字符,但是可以通过指向字符数组,间接改变单个字符!

cString.c

#include "cString.h"

char *StringStr = NULL;
void cStringFree(void)
{
	free(StringStr);
}

/**
* @brief  获取两个字符串之间的字符串
* @param  Str  源字符串
* @param  StrBegin  开始的字符串
* @param  StrEnd    结束的字符串
* @retval 字符串首地址
* @example  printf("%s",StrBetwStringMalloc("wqe5w4ew46e5w","5w","6e"));cStringFree();  输出:4ew4   
**/
char *StrBetwStringMalloc(char *Str,char *StrBegin,char *StrEnd)
{
	char *StrStart=0,*StrStop=0,len=0;
	len = strlen(StrBegin);//字符串长度
	
	StrStart=strstr(Str, StrBegin);//第一个字符串开始的地址
	if(StrStart)
	{
	  	StrStop = strstr(StrStart+len+1, StrEnd);//第二个字符串开始的地址
		if(StrStop)
		{
			StringStr = (char *)malloc(((StrStop - (StrStart+len))+1) *sizeof(char));//多分配一个空间,防止其它数据干扰
			memset(StringStr,NULL,(StrStop - (StrStart+len))+1);
			memcpy(StringStr, StrStart+len, (StrStop - (StrStart+len)));
			return StringStr;
		}
		else	
			return NULL;
	}
	else	
		return NULL;
}

char *StrStop = NULL;
char StringValue;
void cStringRestore(void)
{
	*StrStop = StringValue;//补上当时截断的字符串
}
/**
* @brief  获取两个字符串之间的字符串 - 需要注意的是该函数必须传进来字符数组,不能是字符串常量
* @param  Str  源字符串
* @param  StrBegin  开始的字符串
* @param  StrEnd    结束的字符串
* @retval 字符串首地址
* @example  char data[] = "wqe5w4ew46e5w"; printf("%s",StrBetwString(data,"5w","6e"));cStringRestore();  输出:4ew4   
**/
char *StrBetwString(char *Str,char *StrBegin,char *StrEnd)
{
	char *StrStart=0,len=0;
	len = strlen(StrBegin);//字符串长度
	StrStart=strstr(Str, StrBegin);//第一个字符串开始的地址
	if(StrStart)
	{
		StrStop = strstr(StrStart+len+1, StrEnd);//第二个字符串开始的地址
		if(StrStop)
		{
			StringValue = *StrStop;
			*StrStop = 0;//截断
			return StrStart+len;
		}
		else 
			return NULL;
	}
	else 
		return NULL;
}


/**
* @brief  分割字符串
* @param  src        源字符串
* @param  separator  分割
* @param  dest       接收子串的数组
* @param  num        子字符串的个数
* @retval None
* @example split("42,uioj,dk4,56",",",temp,&cnt);  temp[0]=42,...temp[3]=56  cnt=4
**/
void split(char *src,const char *separator,char **dest,int *num) 
{
	char *pNext;
	int count = 0;
	if (src == NULL || strlen(src) == 0)
		return;
	if (separator == NULL || strlen(separator) == 0)
		return;
	pNext = (char *)strtok(src,separator);
	while(pNext != NULL) 
	{
		if(dest != NULL)
		*dest++ = pNext;
		++count;
		pNext = (char *)strtok(NULL,separator);
	}  
	*num = count;
}

cString.h

#ifndef _CSTRING_H
#define _CSTRING_H


void cStringFree(void);
void cStringRestore(void);
char *StrBetwStringMalloc(char *Str,char *StrBegin,char *StrEnd);
char *StrBetwString(char *Str,char *StrBegin,char *StrEnd);
void split(char *src,const char *separator,char **dest,int *num);


#endif
发布了653 篇原创文章 · 获赞 1016 · 访问量 73万+

猜你喜欢

转载自blog.csdn.net/ReCclay/article/details/104017259