zoukankan      html  css  js  c++  java
  • 串的基本操作

    #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):");
    }
  • 相关阅读:
    Ionic开发Hybrid App问题总结
    >>> 主页链接
    微信小程序之WebSocket
    Keepalived+LVS+nginx搭建nginx高可用集群
    centos7 dns(bind)安装配置
    samba安装配置
    redis数据备份还原
    gitlab部署
    gitlab数据迁移
    kubeadm部署一个Kubernetes集群
  • 原文地址:https://www.cnblogs.com/qq2424260747/p/4923446.html
Copyright © 2011-2022 走看看