串的基本操作(顺序存储)

#include<stdio.h>
/*定义串*/
#define MAXLEN 255
typedef struct{
	char ch[MAXLEN];	//每个分量存储一个字符
	int length;			//串的实际长度
}SString;

/*求串的长度*/
int StrLength(SString S){
	return S.length;
}

/*求子串*/
bool SubString(SString &Sub, SString S, int pos, int len){
	//子串范围越界
	if(pos+len-1 > S.length)
		return false;
	
	for (int i=pos-1; i<pos+len-1; i++){
		Sub.ch[i-pos+1] = S.ch[i];
		Sub.length = len;
	}
	
	return true;
}

/*比较串的大小*/
int StrCompare(SString S, SString T){
	//比较操作:若S>T,返回值>0;若S=T,则返回值=0;若S<T,则返回值<0
	for(int i=0; i<S.length && i<T.length; i++){
		if(S.ch[i] != T.ch[i])
			return S.ch[i]-T.ch[i];
	}
	//扫描过的所有字符都相同,则长度长的串更大
	return S.length-T.length;
}

/*定位操作:借助基本操作*/
int Index(SString S, SString T){
	int i=0, n=StrLength(S), m=StrLength(T);
	SString sub;				//用于暂存子串
	while(i < n-m+1){			//依次取出不同子串对比
		SubString(sub, S, i, m);
		if(StrCompare(sub, T) != 0)	++i;
		else return i;			//返回子串在主串中的位置
	}
	
	return 0;					//S中不存在与T相等的子串
}

int main(){
	int ret;
	SString S = {"abcdef",6};	//注意:结构体字符数组不能直接用=赋值
	SString T = {"zxcvbnm",7};
	
	printf("/******StrCompare*******/\n");
	
	/*比较串的大小*/
	ret=StrCompare(S,T);
	if(ret > 0)
		printf("S>T\n");
	else if(ret == 0)
		printf("S=T\n");
	else
		printf("S<T\n");
	
	printf("/******SubString********/\n");
	
	/*求子串*/
	SString Sub={"",0};			//初始化时清空数组,避免脏数据
	if(SubString(Sub,S,1,3)){
		printf("%s\n",Sub.ch);
	}
	
	printf("/******Index************/\n");
	
	/*定位操作:借助基本操作*/
	ret = Index(S,T);
	if(ret != 0){
		printf("When i=%d,S=T\n",ret);
	}
	else
		printf("S!=T\n");
	
	return 0;
}

















  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值