串的基本操作

#include<stdio.h>
#define MAXSTRLEN 255
#define TRUE 1
#define FALSE 0
#define OK 1
typedef int Status;
typedef unsigned char SString[MAXSTRLEN+1];

Status StrAssign(SString &T,char *chars);//串赋值,生成一个其值等于chars的串T
Status StrCopy(SString &T,SString S);//串复制,由串S复制得串T
int StrCompare(SString S,SString T);//串比较,若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0;
int StrLength(SString S);//返回S的元素个数,称为串的长度
Status Concat(SString &T,SString S1,SString S2);//用T返回有S1和S2联接而成的新串。若未截断,则返回TRUE,否则返回FALSE
Status SubString(SString &Sub,SString S,int pos,int len);//用Sub返回串S的第pos个字符起长度为len的子串
int Index(SString S,SString T,int pos);//T为非空串,若主串S中第pos个字符之后存在与T相等的子串,则返回第一个这样的子串在S中的位置,否则返回0
void PrintStr(SString S);//输出串的值
void PrintMenu();
int main()
{
    SString S1,S2,S3;
    int i,pos,len;
    char chars[MAXSTRLEN];
    int z=1;
    int cdh;//选择的菜单号
    while(z)
    {
        do{
            PrintMenu();
            scanf("%d",&cdh);
            if(cdh<0||cdh>6)
                printf("菜单号输入错误,请重新输入!
");
        }while(cdh<0||cdh>6);
        getchar();
        switch(cdh){
        case 0:
            z=0;
            break;
        case 1://串复制
            printf("串复制,把S1复制到S2---------------------
");
            printf("请输入串S1的值:");
            gets(chars);
            StrAssign(S1,chars);
            if(StrCopy(S2,S1))
            {
                printf("复制成功!串S2的长度是:%d;
值是:",StrLength(S2));
                PrintStr(S2);
            }
            break;
        case 2://串比较
            printf("串比较,比较串S1和S2的大小----------------------------
");
            printf("请输入串S1的值:");
            gets(chars);
            StrAssign(S1,chars);
            printf("请输入串S2的值:");
            gets(chars);
            StrAssign(S2,chars);
            i=StrCompare(S1,S2);
            if(i>0)
                printf("比较结果:S1大于S2。
");
            else if(i==0)
                printf("比较结果:S1等于S2。
");
            else
                printf("比较结果:S1小于S2。
");
            break;
        case 3://求串长
            printf("求串长------------------------------
");
            printf("请输入串S1的值:");
            gets(chars);
            StrAssign(S1,chars);
            printf("串长是:%d
",StrLength(S1));
            break;
        case 4://串联接
            printf("串联接------------------------------
");
            printf("请输入串S1的值:");
            gets(chars);
            StrAssign(S1,chars);
            printf("请输入串S2的值:");
            gets(chars);
            StrAssign(S2,chars);
            if(Concat(S3,S1,S2)) printf("S2没有被截断;");
            else printf("S2被截断;");
            printf("联接结果:
");
            PrintStr(S3);
            break;
        case 5://求子串
            printf("求子串--------------------------------
");
            printf("请输入主串:
");
            gets(chars);
            StrAssign(S1,chars);
            printf("请输入起始位置pos:
");
            scanf("%d",&pos);
            printf("请输入所求子串长度len:
");
            scanf("%d",&len);
            if(SubString(S2,S1,pos,len))
            {
                printf("求子串成功!子串是:
");
                PrintStr(S2);
            }
            else
                printf("求子串失败!
");
            break;
        case 6://求子串在主串中的位置
            printf("求子串在主串中的位置-----------------------------------
");
            printf("请输入主串:
");
            gets(chars);
            StrAssign(S1,chars);
            printf("请输入子串:
");
            gets(chars);
            StrAssign(S2,chars);
            printf("请输入起始位置pos:
");
            scanf("%d",&pos);
            i=Index(S1,S2,pos);
            if(i)
            {
                printf("找到了,子串在主串第%d个字符之后第一次出现的位置是%d。
",pos,i);
            }
            else
                printf("子串在主串第%d个字符之后未出现。
",pos);
            break;
        }
    }
    return 0;
}
Status StrAssign(SString &T,char *chars)//串赋值,生成一个其值等于chars的串T
{
    int i=0;
    while(chars[i]!='')//括号中的条件也可略写为chars[i]
    {
        T[i+1]=chars[i];
        i++;
    }
    T[0]=i;
    return OK;
}
Status StrCopy(SString &T,SString S)//串复制,由串S复制得串T
{
    int i;
    for(i=0;i<=S[0];i++)
        T[i]=S[i];
    return OK;
}
int StrCompare(SString S,SString T)//串比较,若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0;
{
    int i=1;
    while(i<=S[0]&&i<=T[0])
    {
        if(S[i]==T[i])
            i++;
        else
            return (S[i]-T[i]);
    }
    if(i>S[0]&&i>T[0])//两个字符串都比到最后一个字符并且对应字符都相等,两个串相等
        return 0;
    else if(i>S[0])//串S比T短,前面的字符都对应相等,则S<T
        return -1;
    else//串T比S短,前面的字符都对应相等,则S>T
        return 1;
}
int StrLength(SString S)//返回S的元素个数,称为串的长度
{
    return S[0];
}
Status Concat(SString &T,SString S1,SString S2)//用T返回有S1和S2联接而成的新串。若未截断,则返回TRUE,否则返回FALSE
{
    int uncut,i;
    if(S1[0]+S2[0]<=MAXSTRLEN)
    {
        for(i=1;i<=S1[0];i++)
            T[i]=S1[i];
        for(i=S1[0]+1;i<=S1[0]+S2[0];i++)
            T[i]=S2[i-S1[0]];
        T[0]=S1[0]+S2[0];
        uncut=TRUE;
    }
    else if(S1[0]<MAXSTRLEN)
    {
        for(i=1;i<=S1[0];i++)
            T[i]=S1[i];
        for(i=S1[0]+1;i<=MAXSTRLEN;i++)
            T[i]=S2[i-S1[0]];
        T[0]=MAXSTRLEN;
        uncut=FALSE;
    }
    else
    {
        for(i=1;i<=S1[0];i++)
            T[i]=S1[i];
        T[0]=MAXSTRLEN;
        uncut=FALSE;
    }
    return uncut;
}
Status SubString(SString &Sub,SString S,int pos,int len)//用Sub返回串S的第pos个字符起长度为len的子串
{
    int i;
    if(pos<=S[0]&&len<=S[0]-pos+1)//len+pos-1<=S[0]时,才能够截取到长度为len的子串
    {
        for(i=1;i<=len;i++)
            Sub[i]=S[pos+i-1];
        Sub[0]=len;
        return TRUE;
    }
    return FALSE;
}
int Index(SString S,SString T,int pos)//T为非空串,若主串S中第pos个字符之后(起)存在与T相等的子串,则返回第一个这样的子串在S中的位置,否则返回0
{
    int i,m,n;
    SString sub;
    if(pos>0)
    {
        n=StrLength(S);
        m=StrLength(T);
        i=pos;
        while(i<=n-m+1)
        {
            SubString(sub,S,i,m);
            if(StrCompare(sub,T)!=0) ++i;
            else return i;
        }//while
    }//if
    return 0;
}//Index

void PrintStr(SString S)//输出串的值
{
    int i;
    for(i=1;i<=S[0];i++)
        putchar(S[i]);
    putchar('
');        
}
void PrintMenu()
{
    printf("
      串的基本操作     
");
    printf("-------------------------
");
    printf("*     1-串复制          *
");
    printf("*     2-串比较          *
");
    printf("*     3-求串的长度      *
");
    printf("*     4-串联接          *
");
    printf("*     5-求子串          *
");
    printf("*     6-子串在主串中位置*
");
    printf("*     0-退出            *
");
    printf("-------------------------
");
    printf("请选择菜单号(0-6):");
}
原文地址:https://www.cnblogs.com/qq2424260747/p/4923446.html