#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define maxsize 110//最大串长
typedef struct
{
char data[maxsize];//每个分量存一个字符
int length=0;//串的实际长度
}SqString;//从data【0】开始存储,不包含'\0'
//清空串 逻辑上清空
bool ClearString(SqString &T)
{
T.length=0;
return true;
}
//判断串是否为空,为空则返回True
bool StrEmpty(SqString T)
{
return T.length;
}
//把chars赋值给T 【创】
bool StrAssign(SqString &T,char chars[])
{
ClearString(T);//防止有数据残留,导致最后计算的长度出错
for(int i=0;chars[i]!='\0';i++)//将chars中的字符一个一个赋值给T
{
if(T.length>=maxsize){ClearString(T); return false;}// chars超出了T的最大存储长度
T.data[i]=chars[i];
T.length++;
}
return true;
}
//把串T中的字符复制到串S中
bool StrCopy(SqString &S,SqString T)
{
ClearString(S);//去除脏数据
for(int i=0;i<T.length;i++)
{
S.data[i]=T.data[i];
S.length++;
}
return true;
}
//比较两个字符串的长度
int StrCompare(SqString S,SqString T)//S>T 返回>0 ,S=T 返回0, S<T返回<0
{
for(int i=0;i<T.length&&i<S.length;i++)
{
if(S.data[i]!=T.data[i]) return S.data[i]-T.data[i];
}
return S.length-T.length;//此时说明有一个字符串是另一个字符串的前缀,所以直接判断长度
}
//求子串
bool SubString(SqString &Sub,SqString T,int pos,int len)//求子串[第几个字符]并返回到Sub中
{
if(pos-1+len-1>T.length-1) {ClearString(Sub); return false;}//子串输入错误,超出T
for(int i=0;i<len;i++)//T.data[0]也存放字符,因此POS-1
{
Sub.data[i]=T.data[pos-1+i];
}
Sub.length=len;
return true;
}
//串联接 用T返回由S1和S2 联结的串
bool Concat(SqString &T,SqString S1,SqString S2)
{
StrEmpty(T);//去除脏数据
if(maxsize<S1.length+S2.length) return false;
for(int i=0,j=0;i<S1.length+S2.length;i++)//分别用i,j标记S1,S2
{
if(i<S1.length)
T.data[i]=S1.data[i];
else
T.data[i]=S2.data[j++];
}
T.length=S1.length+S2.length;
return true;
}
//定位操作,返回字符串S在T中第一次出现的位置[第几个字符],若不存在,则返回-1
int Index(SqString S,SqString T)
{
for(int i=0;i<T.length;i++)//从第一个位置开始判断
{
SqString sub;
if(SubString(sub,T,i+1,S.length))//取出长度为S.length的字符串存入sub中
{
if(StrCompare(sub,S)==0)//两个字符串相等
return i+1;
}
}
return -1;
}
bool StrDisplay(SqString T)//输出字符到屏幕中
{
for(int i=0;i<T.length;i++)
{
cout<<T.data[i]<<" ";
}
cout<<endl;
return true;
}
int main()
{
SqString T,S,W,L;
char c[]="sadsdc",d[]="sadsdcz";
StrAssign(T,c);
//StrDisplay(T);
StrCopy(S,T);
//StrDisplay(S);
//比较长度
StrAssign(T,c);
StrAssign(S,d);
//cout<<StrCompare(T,S);
//求子串
if(SubString(S,T,6,5))//测试数据 [6 1][ 6 2] [2 5] [2 6]
StrDisplay(S);
else
cout<<"你个zz"<<endl;
//串联结
char e[]="i love ",f[]="mon and my sisters !";
StrAssign(T,e);
StrAssign(S,f);
Concat(W,T,S);
StrDisplay(W);
StrDisplay(S);
//定位操作
cout<<Index(S,W);
cout<<Index(T,W);
}
字符串的基本操作【静态数组/顺序存储】
最新推荐文章于 2023-10-31 19:18:01 发布