串(string)是由零个或多个字符组成的有限序列。串中字符的数量length称为串的长度,零个字符的串称为空串。我们在串上可以进行截取,拼接,拷贝,比对等等操作,下面通过c语言代码进行具体实现。
一、图文实现
1.1,串的声明
我们通过一个结构体定义我们的串,串有两个成员:指向字符数组的指针和记录字符长度的整数。其余的串的操作函数我们也声明在其中!
#define OK 1
#define ERROR 0typedef struct TString
{char *ch;int length;
}tstring;int tStrInsert(tstring *,int pos,tstring *);int tStrLength(tstring *);void testTString();char * tStrCpy(char *,const char *);int tStrAssign(tstring *,const char *);int tStrCompare(tstring *,tstring *);int clearTString(tstring *);tstring * tStrConcat(tstring *,tstring *);tstring * tStrSubstring(tstring *,int pos,int len);
1.2,串的初始化
我们通过一个tStrAssign函数,进行串的初始化,该函数实现具体如下:
tStrAssign(tSrc,"tpc");
int tStrAssign(tstring *tStr,const char *cStr)
{if(tStr->ch) //判断字符串是否为空{free(tStr->ch); //不为空先进行空间释放}const char *c = cStr; //定义一个指针指向字符串数组int i=0;for(i;*c!='\0';++i,++c); //计算传入的字符串长度if(!i) //如果传入字符串长度为0{tStr->ch = NULL;tStr->length = 0;}else{if(!(tStr->ch = (char *)malloc(i*sizeof(char)))) //动态申请空间{printf("string malloc failed!\n");exit(0);}for(int j=0;j<i;++j){*(tStr->ch+j) = *(cStr+j); //字符拷贝}tStr->length = i; //记录字符串长度}return OK;}
1.3,串的拼接
串的拼接,我们需要计算两个字符串的长度,然后重新动态申请总长度空间,然后把字符串拼接到原有字符串后面。
tstring * tStrConcat(tstring *s,tstring *d)
{if(!(s->ch = (char *)realloc(s->ch,(s->length+d->length)*sizeof(char)))) //申请总长度空间{printf("the string malloc failed\n");exit(0);}for(int i=0;i<d->length;i++){*(s->ch+s->length+i) = *(d->ch+i); //从源字符串末尾位置新增一位开始字符拷贝。}s->length +=d->length; //存入新的长度free(d->ch);free(d);return s;
}
1.4,串的截取
串的截取,通过新申请需要截取长度的空间用来存储新的字符串。
tstring * tStrSubstring(tstring *s,int pos,int len)
{if(pos<1||pos>s->length||len<0||len>s->length-pos+1) //如果越界,则退出{return NULL;}tstring *d = (tstring *)malloc(sizeof(struct TString)); if(!len){d->ch = NULL;d->length = 0;}else{d->ch = (char *)malloc(len*sizeof(char)); //需要截取字符串空间for(int i=0;i<len;i++){*(d->ch+i) = *(s->ch+pos+i-1); //字符拷贝}d->length = len;}return d;
}
1.5,其他
其他函数有字符串比较,字符串插入等,如下:
int tStrInsert(tstring *src,int pos,tstring *dest)
{if(pos<1||pos>src->length+1){printf("the pos is out range of string!\n");return ERROR;}if(src->length){if(!(src->ch = (char *)realloc(src->ch,(src->length+dest->length)*sizeof(char)))){printf("the string insert reallo failed!\n");exit(0);}for(int i=src->length;i>=pos;--i){*(src->ch+dest->length+i)=*(src->ch+i); //字符移动}for(int j=0;j<=dest->length-1;++j){*(src->ch+pos+j) = *(dest->ch+j); //字符插入}src->length+=dest->length;}return OK;
}int tStrCompare(tstring *s,tstring *d)
{for(int i=0;i<s->length&&i<d->length;++i){if(*(s->ch+i) != *(d->ch+i)){return *(s->ch+i) - *(d->ch+i);}}return s->length - d->length;
}char * tStrCpy(char *dest,const char *src)
{char *ret;ret = dest;while(*dest++=*src++);return ret;
}
二、测试
我们通过新增一个测试函数,进行具体功能的测试:
void testTString()
{tstring *tSrc = (tstring *)malloc(sizeof(struct TString));tstring *tDes = (tstring *)malloc(sizeof(struct TString));tSrc->ch = NULL;tDes->ch = NULL;tStrAssign(tSrc,"tpc");tStrAssign(tDes," is the best");tStrConcat(tSrc,tDes);printf("the concat string is: %s\n",tSrc->ch);tstring *subStr = tStrSubstring(tSrc,1,3);printf("the substr is: %s\n",subStr->ch);free(subStr);free(tSrc);
}