串的相关操作——自定义

今天写了一下串的一些常用的库函数的自定义版本。比如strlen(),strcpy(),char *strcat(char *,char *),strstr(char *,char *)等函数。下面是我的代码,当然可能与标准函数库STL中提供的库函数功能有所不同。但大致的内容是一样的,只是细节可能不同而已。

下面是代码:

//串的表示、实现和基本操作
//求串长StrLength()\ 插入运算StrInsert(),从pos处插入子串T
//子串删除StrDelete()\串连接StrCount()\去子串SubString()
//串复制函数Strcpy()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Max 25
typedef char Str[Max+1];
typedef struct seq
{
	Str str;
	int len;
}*Seqstring,seq;

bool Is_empty(Seqstring S){ //判空
	return S->len==0;
}
bool Is_full(Seqstring S){  //判满 
	return S->len==Max;
}
int StrLength(Seqstring S){ //求串长度(特殊情况为当输入的串超过了实际定义的最大长度时,返回最大长度值Max)
	int count=0;
	int i=0;
	while(S->str[i]){
		i++;
		count++;
		if(count==Max)
			return count;
	}
	return count;
}
void Strcpy(Seqstring S,Seqstring T){ //串拷贝函数
	for(int i=0;i<T->len;i++)
		S->str[i]=T->str[i];
	S->str[T->len]='\0';
	S->len=T->len;
}
void StrInsert(Seqstring S,int pos,Seqstring T){ //串插入函数,实现的具体功能是:当串S非空,且不满,且插入位置在0—strlen(s)-1范围内,且插入串的长度与S串的长度之和 不能超过Max,从下标为pos开始插入串T.
    if(Is_empty(S)){
		printf("the Seqstring is empty\n");
	    Strcpy(S,T);
		return ;
	}
	if(Is_full(S)){
		printf("Sorry!you cannot Insert for the Seq is full\n");
		return ;
	}
	if(S->len+T->len>Max){
		printf("wrong operator\n");
		return ;
	}
	if(pos<0 || pos>S->len-1){
		printf("wrong location\n");
		return ;
	}
    int i;
	for(i=S->len+T->len-1;i>=pos+T->len;i--)
		S->str[i]=S->str[i-T->len];
	for(i=pos;i<=pos+T->len-1;i++)
		S->str[i]=T->str[i-pos];
	S->len+=T->len;
	S->str[S->len]='\0';
}
void StrDelete(Seqstring S,int pos,int l){ //串删除函数,串不能为空,且插入位置在0-strlen(S)范围内,从下标为pos开始删除l个字符。
	if(Is_empty(S)){
		printf("the Seq is empty\n");
		return ;
	}
	if(pos<0 || pos>S->len-1){
		printf("wrong operator\n");
		return ;
	}
    if(S->len-pos<=l){
		S->str[pos]='\0';
		S->len=pos;
		return ;
	}
	else{
		for(int i=pos+l;i<S->len;i++)
			S->str[i-l]=S->str[i];
		S->len-=l;
		S->str[S->len]='\0';
	}
}
void StrCat(Seqstring S,Seqstring T){ //串连接函数,条件是两串长度之和不能超过Max,将T串连接到S串末尾
	if(S->len+T->len>Max){
		printf("wrong operation\n");
		return;
	}
	int i;
    for(i=S->len;i<=S->len+T->len-1;i++)
		S->str[i]=T->str[i-S->len];
	S->str[i]='\0';
	S->len+=T->len;
}
Seqstring Strstr(Seqstring S,int pos,int l){ //串查找函数,条件,串不能为空,且查找初始位置在0-strlen(S)-1范围内,则从下标为pos开始查找l长度的字符,并返回查找串的指针(地址)。
	if(Is_empty(S)){
		printf("the Seq is empty\n");
		return NULL;
	}
	if(pos<0 || pos>S->len-1){
		printf("wrong operation\n");
		return NULL;
	}
	if(S->len-pos<=l){
		Seqstring p=(Seqstring)malloc(sizeof(seq));
		for(int i=pos;i<=S->len-1;i++)
	        p->str[i-pos]=S->str[i];
		p->len=S->len-pos;
		p->str[p->len]='\0';
		//printf("%s\n",p->str);
		return p;
	}
	else{
		Seqstring q=(Seqstring)malloc(sizeof(seq));
		for(int i=pos;i<=pos+l-1;i++)
			q->str[i-pos]=S->str[i];
		q->len=l;
		q->str[l]='\0';
		//printf("%s\n",q->str);
		return q;
	}
}
//测试函数
int main()
{
	seq s;
	Seqstring p=&s,q;
	printf("输入串\n");
	scanf("%s",p->str);
	getchar();
	p->len=StrLength(p);
	if(p->len==Max)
		p->str[Max]='\0';
	while(true){
	printf("提供如下操作  \
	        1--------求长度\
			2--------复制串 \
			3--------插入子串\
			4--------删除字串\
			5--------拼接串\
			6--------查找串\
			7--------退出\n");
		switch(getchar())
		{
	case '1':
			getchar();
			printf("串长度为%d\n",StrLength(p));
		    break;
	case '2':
	    getchar();
		q=(Seqstring)malloc(sizeof(seq));
		printf("请输入新串\n");
		scanf("%s",q->str);
		getchar();
		Strcpy(q,p);
		printf("拷贝后的串为:%s\n",q->str);
		free(q);
		break;
case '3':
	    getchar();
	    q=(Seqstring)malloc(sizeof(seq));
	    printf("输入你想插入的串:\n");
	    scanf("%s",q->str);
		q->len=StrLength(q);
		if(q->len==Max)
			q->str[Max]='\0';
		printf("输入你想插入的位置:\n");
		int *ppos;
		ppos=new int;
		scanf("%d",ppos);
		getchar();
		printf("插入前的串为:%s\n",p->str);
		StrInsert(p,*ppos,q);
		printf("插入后的串为:%s\n",p->str);
		free(q);
		delete ppos;
		break;
case '4':
	    getchar();
		printf("原字符串为:%s\n",p->str);
	    int *pos;
		pos=new int;
		int *Len;
		Len=new int;
		printf("请输入你想删除的位置和长度:\n");
		scanf("%d%d",pos,Len);
		getchar();
		StrDelete(p,*pos,*Len);
		printf("删除后的串为:%s\n",p->str);
		delete pos;
		delete Len;
		break;
case '5':
	   getchar();
	   printf("原字符串为:%s\n",p->str);
	   q=(Seqstring)malloc(sizeof(seq));
	   printf("请输入你想连接的串:\n");
	   scanf("%s",q->str);
	   getchar();
	   q->len=StrLength(q);
	   if(q->len==Max)
		   q->str[Max]='\0';
	   StrCat(p,q);
	   printf("连接后的串为:%s\n",p->str);
	   free(q);
	   break;
case '6':
	  getchar();
	  printf("原字符串为:%s\n",p->str);
	  int *Pos;
	  Pos=new int;
	  int *len;
	  len=new int;
	  printf("请输入你想查询的位置和长度\n");
	  scanf("%d%d",Pos,len);
	  getchar();
	  q=Strstr(p,*Pos,*len);
	  printf("查询后的串为:%s",q->str);
	  free(q);
	  delete Pos;
	  delete len;
	  break;
case '7':
	  getchar();
	  printf("do you really want to exit Y/N\n");
	  switch(getchar())
	  {
  case 'Y':case 'y': getchar();exit(0); break;
  case 'N':case 'n': getchar();break;
	  }
	  break;
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值