串的功能实现

#include "stdlib.h"
#include "stdio.h"
#define STRINGMAX 81
#define LEN sizeof(struct string)
struct string
{
	int len;
	char ch[STRINGMAX];
};
typedef struct string STRING;
//--------------------函数声明------------------//
void creat(STRING *s);
void print(STRING *s);
void concat(STRING *s,STRING *t);
STRING *substr(STRING *s,int start,int len);
void delete1(STRING *s,int start,int len);
int index(STRING *s, STRING *t, int pos);
main()
{
	STRING *s,*t,*v;
	int start,len,id,pos;
	int position,flag;
	t=(STRING *)malloc(LEN);
	s=(STRING *)malloc(LEN);
	v=(STRING *)malloc(LEN);
	printf("请输入第一个串s:");
	creat(s);
	printf("\n s->len:%d",s->len);
	printf("\n请输入另外一个串t:");
	creat(t);
	printf("\n t->len:%d",t->len);
	printf("\n 请选择你的操作: ");
	printf("\n1:连接两个串 2: 求字串 3: 删除子串 4: 查找子串 \n");
	scanf("%d",&id);
	switch(id)
	{
		case 1:
			{
				concat(s,t); //链接两个串
				printf("连接后的新串s :\n");
				print(s);
			}
		break;
		case 2: //----------------以下取子串-------
			{
				printf("请输入子串起始位置:");
				scanf("%d",&start);
				printf("请输入子串长度:");
				scanf("%d",&len);
				v=substr(s,start,len);
				printf("获取的字串是 :\n");
				print(v);
			}
		break;
		case 3: //----------------以下是删除子串-----
			{
				printf("请输入删除的子串起始位置:");
				scanf("%d",&start);
				printf("请输入删除的长度:");
				scanf("%d",&len);
				delete1(s,start,len);
				printf("删除子串后的串s :\n");
				print(s);
			}
		break;
		case 4:
			{
				printf("请输入比较起始位置:");
				scanf("%d",&pos);
				if(index(s,t,pos))
					{
						printf("匹配成功!\n");
						printf("匹配的位置为:");
						printf("%d\n",index(s,t,pos));
					}
				else
					printf("匹配失败!\n");
			}
		break;
	}
}
//-----------------------------------------------main结束-------------------------
void delete1(STRING *s,int start,int len)//删除子串
{
	int i;
	if (start<=s->len&&len>=0&&start+len<=s->len)
	{
		for(i=start+len;i<=s->len;i++)
		s->ch[i-len]=s->ch[i];
		s->len=s->len-len;
	}
	else
		printf("cannot delete!\n");
}
STRING *substr(STRING *s,int start,int len)//取子串
{
	int i;
	STRING *t;
	t=(STRING *)malloc(LEN);
	if (start<0&&start>=s->len)
		return(NULL);
	else
		if (len>=1&&len<=s->len-start)
		{ 
			for(i=0;i<len;i++)
				t->ch[i]=s->ch[start+i];
			t->len=len;
			t->ch[i]='\0';
			return(t);
		}
	else
		return(NULL);
}
void concat(STRING *s,STRING *t)//链接两个子串
{
	int i,j;
	if (s->len+t->len>(STRINGMAX))
		printf("too long!cannot concat!!");
	else
	{
		j=s->len;
		for (i=0;i<t->len;i++)
		s->ch[i+j]=t->ch[i];
		s->ch[i+j]= '\0';
		s->len=s->len+t->len;
	}
}
void creat(STRING *s)//创建串
{
	char c;
	int i;
	for (i=0;((c=getchar())!='\n'&&i<81);i++)
		s->ch[i]=c;
	s->len=i;
	s->ch[i+1]= '\0';
}
void print(STRING *s)//打印串
{
	if(s==NULL)
		printf("error!\n");
	else
	{
		int i;
		for (i=0;s->ch[i]!='\0';i++)
			printf("%c",s->ch[i]);
		printf("\n");
	}
} 
int index(STRING *s, STRING *t,int pos)//子串比较
{
	int i=pos-1,j=0;
	if(t==NULL||s==NULL)
		printf("error!\n");
	else
	{
		 while(i<=s->len&&j<=t->len)
		 {
			 if(s->ch[i]==t->ch[j])
			 {
				 ++i;++j;
			 }
			 else
			 {
				 i=i-j+1;
				 j=0;
			 }
		 }
		 if(j>=t->len) 
		 {
			 return i-t->len;
		 }
		 else return 0;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值