有关字符串相关注意事项,可参考下面博文复习
- 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