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相等的子串
}