串的静态顺序存储基本操作

C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符 '\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不能再用字符数组的长度来判断字符串的长度了。

#include <iostream>
#include <stdbool.h>
#define MAXSIZE 225
using namespace std;
typedef unsigned char SString[MAXSIZE + 1];//typdef unsigned char a[MAX_LEN]意思是定义类型unsigned char
                                            // [MAX_LEN]为a的形式
/******************************************/
void  init(SString &T)//初始化
{
    T[0] = 0; //一定要初始化,否则判空无法完成 t[0]为t装入字符串的长度
    return ;
}
/******************************************/
void  Create(SString &T, char chars[])//创建
{
    int i;
    for(i=0;chars[i]!='\0' && i+1<=MAXSIZE;i++)
    {
        T[i+1]=chars[i];
    }
    T[0]=i;

}
/******************************************/
void Display(SString &T)//遍历
{
    int i;
    for(i=1;i<=T[0];i++)
        cout<<T[i];
}
/******************************************/
void Contact(SString &T1,SString &T2,SString &T3)//串连接 t1与t2连接成t3
{
    int i,k;
    for(i=1;i<=MAXSIZE && i<=T1[0];i++)
    {
        T3[i]=T1[i];
    }
    k=i-1;//k为t1的长度
    T3[0]=k;
    for(i=1;i+k<=MAXSIZE && i<=T2[0];i++)
    {
        T3[i+k]=T2[i];
    }
    T3[0]=T3[0]+i-1;//如果t1的长度大于max则因为上面的for里面有i=1所以t3的长度还是t1的长度
}
/******************************************/
void Copy(SString &T,SString &S)//串拷贝
{
    int i;
    for(i=1;i<=T[0];i++)
        S[i]=T[i];
    S[0]=T[0];
}
/******************************************/
bool empty(SString &T)//串判空
{
    if(T[0]==0)
        return true;
    else
        return false;
        
}
/******************************************/
int lengh(SString &T)//求串长
{
    return T[0];
    
}
/******************************************/
void clear(SString &T)
{
    T[0]=0;
}
/******************************************/
//若T大于S 返回值>0        若T等于S 返回值=0 若T小于S 返回值<0
//如果T串是以S串开头的主串  只能返回0
//如果S串是以T串开头的主串  可能返回不确定值
//所以该函数应该是再判断了双方都不是对方的子串的时候才使用
//串比较,如果第一个字符相等,则比较第二个字符,如果t1大于s1则返回正数,小于返回负数,t和s相等返回0
int compare(SString &T,SString &S)//串比较
{
    int i,n=0;
    for(i=1;i<=T[0];i++)
    {
        if(T[i]!=S[i])
        {
            n=T[i]-S[i];
            break;
        }
    }
    return n;
}
/******************************************/
void substr(SString &S,SString &sub, int pos,int len)//子串提取操作从pos的位置提取长度为len的子串
{
    int i;
    if(pos<0  || len<0 || pos+len-1>S[0])
        return;
    for(i=1;i<=len;i++)
    {
        sub[i]=S[pos+i-1];
    }
        sub[0]=i-1;
}
/******************************************/
void insert(SString &S,int pos,SString &T)//插入
{
    SString new_;
    SString temp;
    substr(S,temp,1,pos-1);//把s的第一个字符到pos-1个字符提取成子串temp
    Display(temp);cout<<endl;
    Contact(temp,T,new_);   //把子串temp和要插入的字符串t连接成字符串new_
    Display(new_);cout<<endl;
    substr(S,temp,pos,S[0]-pos+1 );//把s的第pos个字符到最后一个字符提取成子串temp
    Display(new_);cout<<endl;
    Contact(new_,temp,S);//把new_子串和temp子串连接成串s,注意new_和temp的顺序影响新生成字符
    Display(S);cout<<endl;
}
/*****************************************/
//从第一个到要删除的位置的前一个的字符提取子串,从要删除的最后一个字符的下一个到最后提取子串
//然后把两个子串从连接给s
void delete_(SString &s,int pos,int len)//串删除
{
    SString temp;
    SString sub;
    if(pos<1 || pos+len>s[0]+1)
        return ;
    substr(s, temp, 1, pos-1);
    substr(s,sub,pos+len,s[0]-pos-len+1);
    Contact(temp, sub , s);
}
/******************************************/
int Index(SString &S, SString &T, int pos)//寻找子串返回子串首次在母串中出现的首字符的位置
{
    int i=pos;//从第几个位置开始寻找子串t
    int j=1;//从子串的第一个字符开始进行匹配
    
    while (i<=S[0] && j<=T[0])//当i不大于s0的长度且j不大于t0的长度的时候进入循环
    {
        if (S[i] == T[j])//如果当前字符匹配成功,则匹配下一个
        {
            ++i;
            ++j;
        }
        else  //如果当前匹配不成功,j为t的第一个字符,i为当前匹配到的字符
        {
            i = i-j+2;//i不写成i++的原因是虽然可以表示如果第一个字符不符合而后面的符合
            j = 1;    //但不能表示当第一个符合s的第二个不符合t的第二个但不一定不符合t的第一个,所以应该保留当前位置
        }             //如果是i++则会继续前进
    }
    
    if (j > T[0])
        return i-T[0];
    else
        return 0;
}
/****************************/
int main()
{
    SString t1,t2;
    char a[100],b[100];
    cin>>a;
    cin>>b;
    init(t1);
    init(t2);
    Create(t1, a);
    Create(t2, b);
    return 0;
    
}

http://blog.csdn.net/zhuyi2654715/article/details/6740707
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值