字符串的基本操作(包括串赋值,串拼接,求子串,查找串,删除与插入等等)

1.串的定义

  串(String)是零个或多个字符组成的有限序列。一般记作:S=“a1a2a3…an”,

其中,S是串名; “a1a2a3…an”是串值;ai(1in)可以是字母、数字或其它字符

串的长度:串中所包含的字符个数;

空串:长度为零的串称为空串(Empty String),它不包含任何字符。

空白串: 通常将仅由一个或多个空格组成的串称为空白串(Blank String)。

     注意:空串和空白串的不同。

2.串的基本运算(抽象运算)

串赋值: StrAssign(&S, chars)

串比较: StrCompare(S, T)

求串长: StrLength(S)

串联接: Concat(&T,S1,S2)

求子串:  SubString(&sub, S, pos, len)

串复制 : StrCopy(&T,S)

子串定位: Index(S,T,pos)

3. 串的表示(定长存储和堆存储)

 定长顺序存储

typedef struct{

        char ch[MaxStrlen];

        int length;

}SqString;

堆分配存储:

   typedef struct{

               char *ch;

               int  length;

  }Hstring;

4.串基本运算的代码实现

 1.定义串结构体,以堆分配的存储方式

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>

#define Max 20
#define error 0
#define overflow -2
#define ok 1
#define true 1
#define false 0

typedef struct
{
	char *ch;
	int length;
}HString;

typedef int Status;

2.初始化串

//初始化串 
void InitString(HString &s)
{
	s.ch=NULL;
	s.length=0;
}

3.串赋值


//串赋值 
Status StrAssign(HString &T,char *str)
{
	int i,j;
	InitString(T);
	i=strlen(str);
	if(!i)
		return error;
	else
	{
		T.ch=(char*)malloc(i*sizeof(char));
		if(!T.ch)
			exit (overflow);
		for(j=0;j<i;j++)
			T.ch[j]=str[j];
			T.length=i;
	}
}

4. 判断串非空

//判断串非空 
Status StrEmpty(HString &T)
{
	if(T.length==0&&T.ch==NULL)
		return true;
	else 
		return false;		
}

5.串赋值

//串复制,将S赋给T 
Status StrCopy(HString &T,HString S)
{
	int i;
	InitString(T);
	if(StrEmpty(S))
		return error;
		
	T.ch=(char*)malloc(S.length*sizeof(char));
	if(!T.ch)
		exit(overflow);
		
	for(i=0;i<S.length;i++)
		T.ch[i]=S.ch[i];
		
	T.length=S.length;
	
	return ok;		
}

6.串比较

//串比较 
Status StrCmp(HString S,HString T)
{
	int i;
	for(i=0;i<S.length&&i<T.length;i++)
	{
		if(S.ch[i]!=T.ch[i])
			return S.ch[i]-T.ch[i];
	}
	return 0;
}

7.求串长

Status StrLength(HString S)
{
	if(StrEmpty(S))
		return error;
	else
		return S.length; 
}

8.串清空

//串清空,恢复到初始化时刻 
Status ClearString(HString &s)
{
	if(s.ch)
	{
		free(s.ch);
		s.ch=NULL;
	}
	s.length=0;
	return ok;
}

9.串拼接

//串拼接,将S1,S2拼接后用T返回 
Status Concat(HString &T,HString S1,HString S2)
{
	int i;
	InitString(T);
	T.length=S1.length+S2.length;
	T.ch=(char*)malloc(T.length*sizeof(char));
	if(!T.ch)
		exit(overflow);
		
	for(i=0;i<S1.length;i++)
		T.ch[i]=S1.ch[i];
	for(i=0;i<S2.length;i++)
		T.ch[S1.length+i]=S2.ch[i];
		
	return ok;
}

10.求子串

//求子串,将S从第pos位起len个长度的子串用Sub返回 
Status SubString(HString &Sub,HString S,int pos,int len)
{
	int i;
	InitString(Sub);
	if(StrEmpty(S))
		return error;
	if(pos<1||pos>S.length||len<0||pos+len-1>S.length)
		return error;
	if(len)
	{
		Sub.ch=(char*)malloc(len*sizeof(char));
		if(!Sub.ch)
			exit(overflow);
		for(i=0;i<len;i++)
			Sub.ch[i]=S.ch[pos+i-1];
		Sub.length=len;		
	}
	return ok;
}

11.串索引

//串索引,返回T在S中第pos个字符后第一次出现的位置 
Status Index(HString S,HString T,int pos)
{
	int s,t,i;
	HString Sub;
	InitString(Sub);
	
	if(pos>0)
	{
		s=S.length;
		t=T.length;
		i=pos;
		
		while(i+t-1<=s)
		{
			SubString(Sub,S,i,t);
			if(StrCmp(Sub,T))
					i++;
			else
				return i;
		}
	}
	return 0;
}

12.串插入

//串插入 
Status StrInsert(HString &S,int pos,HString T)
{
	int i;
	if(pos<1||pos>S.length+1)
		return error;
	if(StrEmpty(T))
		return error;
	else
	{
		S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char));
		if(!S.ch)
			exit (overflow);
		for(i=S.length-1;i>=pos-1;i--)
			S.ch[i+T.length]=S.ch[i];
			
		for(i=0;i<T.length;i++)
			S.ch[pos+i-1]=T.ch[i];
			
		S.length+=T.length;			
	}
	return ok;
}

13.串删除

//串删除 
Status StrDelete(HString &S,int pos,int len)
{
	int i;
	if(StrEmpty(S))
		return error;
	if(pos<1||pos+len-1>S.length||len<0)
		return error;
		
	for(i=pos-1;i+len<=S.length;i++)
		S.ch[i]=S.ch[i+len];
	S.length-=len;
	S.ch=(char*)realloc(S.ch,S.length*sizeof(char));
	return ok;
}

 14.串替换

//串替换 ,用v替换主串中所有与T相等的不重叠子串 
Status Replace(HString &S,HString T,HString V)
{
	int i;
	if(StrEmpty(T))
		return error;
	i=Index(S,T,1);
	while(i!=0)
	{
		StrDelete(S,i,StrLength(T));
		StrInsert(S,i,V);
		i+=StrLength(V);
		i=Index(S,T,i); 
	}
	return ok;
}

15.输出串

//输出串S 
void StrPrint(HString S)
{
	int i;
	if(StrEmpty(S))
		printf("S为空串,不可输出!");
	for(i=0;i<S.length;i++)
		printf("%c",S.ch[i]); 
	printf("\n");
}

16.主函数测试,只调用了主要的几个函数,其余函数也可以自行验证

//主函数
int main()
{
	HString S,T,V;
	InitString(T);InitString(S);InitString(V);
	
	printf("***************************\n");
	printf("从键盘输入两串字符(分别为字符串1,2):\n"); 
	char str1[Max]; gets(str1);
	char str2[Max]; gets(str2);
	
	printf("***************************\n");
	printf("实现两串字符的连接: ");
	StrAssign(S,str1);StrAssign(T,str2);
	Concat( V,S, T);
	StrPrint(V); 
	
	printf("\n********************************\n");
	printf("\n对字符串1进行删除操作:\n");
	int pos,len;
	printf("输入你想删除的位置和长度:");
	scanf("%d%d",&pos,&len);
	StrDelete(S, pos, len);
	StrPrint(S);
	
	printf("********************************\n");
	printf("\n将串2插入到修改后的串1的某个位置:\n");
	printf("输入你想插入的位置:");
	scanf("%d",&pos);
	StrInsert(S, pos, T);
	StrPrint(S);
	
	printf("********************************\n");
	printf("\n求串3的子串:\n");
	printf("输入你想取的子串的起始位置和长度:");
	scanf("%d%d",&pos,&len); 
	HString Sub;
	SubString(Sub,V, pos, len);
	StrPrint(Sub);
	
	printf("********************************\n");
	printf("\n清空并释放串指针\n");
	ClearString(S);
	ClearString(V);
	ClearString(T);
	
	printf("\n程序结束!\n");
	return 0;

 } 

5.程序截图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 86
    点赞
  • 433
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值