串——C语言

串(也可称为字符串),是由0个或多个字符组成的有限序列。可以用于文本编辑。

串中任意个连续的字符组成的子序列称为该串的子串。包含子串的串相应的称为主串。与线性表的存储结构相类似,串既可以用链式结构存储,也可以用数组形式存储。

串的基本操作与线性表类似,原理大致相同。而串进行模式匹配时可以用到KMP算法。

代码实现:(这里选用数组存储形式的串)

#include<stdio.h>
#include <string.h>
#include<stdlib.h>
#include <memory.h>
#define MAX 50

typedef unsigned char SString[MAX + 1];

void prin_1()
{
    printf ("\n1、求子串函数\n");
    printf("2、删除子串函数\n");
    printf("3、插入子串函数\n");
    printf("4、串置换\n");
    printf("0、end\n");
    puts("-------------------------------------------------\n");
}
/**创建串**/
void creatS(SString &s)
{
    int n,i;
    char a[MAX+1];
    printf("请输入串s的字符:\n");
    scanf("%s",a);
    n=strlen(a);
    s[0]=n;//下标为0的,用于存放串长
    for(i=1;i<=n;i++)
    {
        s[i]=a[i-1];//将a数组的元素传给s
    }
    s[i+1]='\0';
}
/**串的输出**/
void printf_2(SString s)
{
    int i;
    for(i=1;i<=s[0];i++)
    {
        printf("%c",s[i]);
    }
    printf("\n");
}
/**    求子串函数 **/
int getSubStr(SString &s, int start, int len, SString &subStr)//start为子串开始位置,len为子串长度,subStr为子串
{
    int i,j=1;
    for(i=start+1;i<=start+len;i++)
    {
        subStr[j]=s[i];//将主串对应元素传给子串
        j++;
        subStr[0]=j;
    }
    subStr[i]='\0';
    if(subStr[0]==0)
        return 0;
    else
        return 1;


}
/**删除子串函数**/
int delSubStr(SString &s, int start, int len)//start为串删除开始位置,len为串删除长度
{
    int i;
    for(i=start+1;i<=(s[0]-start-len)+1;i++)
    {
        s[i]=s[i+len];//将起始位置之后的元素往前移动
    }
    s[i]='\0';
    s[0]=s[0]-len;
    if(i==s[0]-start-len)
        return 0;
    else
        return 1;

}
/**插入子串函数**/
int insSubStr(SString &s, SString &subStr, int pos)//subStr为子串,pos为起始位置
{
    int i,j=1;
    char a;
    int l=subStr[0];
    for(i=s[0];i>=pos+1;i--)//将起始位置之后的元素往后移动
    {
        s[i+l]=s[i];
    }
    s[0]=s[0]+l;
    s[s[0]+1]='\0';
    for(i=pos+1;i<subStr[0]+pos+1;i++)//插入子串
    {
        a=s[i];
        s[i]=subStr[j];
        subStr[j]=a;
        j++;
    }
    if(j==1)
        return 0;
    else
        return 1;


}
/**串置换**/
int repStr(SString &s, SString &subStr, int pos)//subStr为子串,pos为起始位置
{
    int i,j=1;
    char a;
    for(i=pos+1;i<subStr[0]+pos+1;i++)//直接将子串代替相应的主串元素
    {
        a=s[i];
        s[i]=subStr[j];
        subStr[j]=a;
        j++;
    }
    if(j==1)
        return 0;
    else
        return 1;

}
int main(void)
{
    SString s,subStr;
    int start,len,pos;
    int a,b;
    creatS(s);
    while(1)
    {
        printf("\n请输入需要的操作:\n");
        prin_1();
        scanf("%d",&a);
        if(a==0)
            break;
        switch(a)
        {
            case 1: ///求子串函数
                {
                     printf("请输入开始位置:\n");
                     scanf("%d",&start);
                     printf("请输入字串长度:\n");
                     scanf("%d",&len);
                     memset(&subStr,0,sizeof(&subStr));
                     b=getSubStr(s,start,len,subStr);
                     if(b!=0)
                     printf_2(subStr);
                     else
                     printf("求取子串失败!\n");
                     break;
                }

            case 2:  ///删除子串函数
                {
                    printf("请输入开始位置:\n");
                    scanf("%d",&start);
                    printf("请输入字串长度:\n");
                    scanf("%d",&len);
                    b=delSubStr(s,start,len);
                    if(b!=0)
                    {
                     if(s[0]==0)
                     {
                         printf("删除后串为空串!\n");
                     }
                     else
                     {
                         printf("删除后的串为:\n");
                         printf_2(s);
                     }
                    }
                    else
                    printf("求取子串失败!\n");
                    break;
                }

            case 3:  ///插入子串
                {
                    printf("请输入开始位置:\n");
                    scanf("%d",&pos);
                    memset(&subStr,0,sizeof(&subStr));
                    creatS(subStr);
                    b=insSubStr(s,subStr,pos);
                    if(b!=0)
                    {
                        printf("串:\n");
                        printf_2(s);
                    }
                    else
                    printf("插入子串失败!\n");
                    break;
                }

            case 4:///串置换
                {
                    printf("请输入开始位置:\n");
                    scanf("%d",&pos);
                    memset(&subStr,0,sizeof(&subStr));
                    creatS(subStr);
                    b=repStr(s,subStr,pos);
                    if(b!=0)
                    {
                        printf("置换串:\n");
                        printf_2(s);
                    }
                    else
                    printf("置换子串失败!\n");
                    break;
                }
            default :
                  printf("输入错误!\n");
                  break;
        }
    }
    return 0;
}
运行结果:

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值