欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 利用c语言详细介绍下串(String)的实现

利用c语言详细介绍下串(String)的实现

2024/11/29 20:12:41 来源:https://blog.csdn.net/tpc4289/article/details/144113430  浏览:    关键词:利用c语言详细介绍下串(String)的实现

    串(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);
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com