【串】比较常见的操作-------静态数组实现

0.静态串

 //1.串的顺序存储:
#define  MAXSIZE 255//预定义最大串长为255

//1.串类型定义(静态数组)
typedef struct 
{
	char ch[MAXSIZE+1];//每个空间存储一个字符
	//这里加1的目的是,串的有效元素要从下标1开始存起,方便管理,长度最大仍然为255
	int length;//串的实际长度
}sstring;
//sstring:结构体别名,用来定义串

1.求子串

用sub返回串s的第pos个字符起长度为len的子串
注意:传入空串Sub的指针,因为要在函数中往其中添加元素

bool Substring(sstring* Sub, sstring s, int pos, int len)

在这里插入图片描述

1.1算法步骤:

(1)判断子串是否越界(从头到子串尾部处的长度小于等于原串长度即为合法)
(2)将子串复制到传入的空串中
(3)更新子串长度

//2.求子串:用sub返回串s的第pos个字符起长度为len的子串
//注意:传入空串Sub的指针,因为要在函数中往其中添加元素
bool Substring(sstring* Sub, sstring s, int pos, int len)
{
	//[1]判断子串是否越界
	//从头到子串尾部处的长度小于等于原串长度即为合法
	if (pos + len - 1 > s.length)
	{
		return false;
	}

	//[2]将子串复制到传入的空串中
	for (int i = pos; i < pos + len; i++)
	{
		Sub->ch[i-pos+1] = s.ch[i];
	}

	//[3]更新子串长度
	Sub->length = len;

	return ture;
}

2.串的比较操作

  • 比较操作:若S>T,则返回值>0;若S=T,则返回值<0;若S<T,则返回值<0
  • 比较规则:从头到尾依次比较每个字符的大小,先出现ASCII码值较大的串即为大串
    若直到一个串比较完后,两串完全相等,则串长的为大串
    在这里插入图片描述
int StrCompare(sstring S, sstring T)

2.1算法步骤:

(1)逐位比较两串的每个字符ASCII码值大小,若不等则返回两字符的差值
(2)扫描过的所有字符都相同,则长度长的串更大

//3.比较串的大小:比较操作。若S>T,则返回值>0;若S=T,则返回值<0;若S<T,则返回值<0
int StrCompare(sstring S, sstring T)
{
	//[1]逐位比较两串的每个字符ASCII码值大小,若不等则返回两字符的差值
	for (int i = 1; i <= S.length && i <= T.length; i++)
	{
		if (S.ch[i] != T.ch[i])
		{
			return S.ch[i]- T.ch[i];
		}
	}

	//[2]扫描过的所有字符都相同,则长度长的串更大
	return S.length - T.length;
}

3.串的定位操作(了解)

  • 若主串S中存在与串T值相同的子串,则返回它在主串s中第一次出现的位置;否则函数值为0。
int Index(sstring s, sstring t)

在这里插入图片描述
在这里插入图片描述

3.1.1算法步骤

(1)求取子串t和主串s的长度
(2)从主串s的起始位置开始扫描,依次遍历与子串长度相同的串并进行比较

  //4.定位操作:若主串S中存在与串T值相同的子串,则返回它在主串s中第一次出现的位置;否则函数值为0。
int Index(sstring s, sstring t) 
{
	//[1]求取子串t和主串s的长度
	int i = 1, n = StrLength(s),m = StrLength(t);
	//这里的StrLength();操作属于基础操作,在此不作赘述
	//这里i==1表示串的起始位置从下标为1的位置开始
	sstring sub;//用于暂存子串

	//[2]从主串s的起始位置开始扫描,依次遍历与子串长度相同的串并进行比较
	while (i <= n - m + 1) 
	{
		Substring(&sub, s, i, m);
		
		if (StrCompare(sub,t) != 0)
		{
			i++;
		}
		else
		{
			return i;//返回子串在主串中的位置
		}
	}
	return 0;//S中不存在与T相等的子串
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值