串的基本操作(0位置存长度方式)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define MAXN 50
#define OK 1
#define ERROR 0
void creat(char *);///创建串
int getSubStr(char *,int ,int ,char *);///求子串
int delSubStr(char *,int ,int );///删除子串
int insSubStr(char *,char *,int );///插入子串
int repStr(char *,char *,int );///置换子串
void print(char *s);///输出串
void clear();///清屏
int main()
{
    int choose;
    char str[MAXN],sub_str[MAXN];
    int start,len,pos;
    do
    {
        printf("\t\t\t*****************\n");
        printf("\t\t\t*1.求子串\t*\n");
        printf("\t\t\t*2.删除子串\t*\n");
        printf("\t\t\t*3.插入字串\t*\n");
        printf("\t\t\t*4.串置换\t*\n");
        printf("\t\t\t*0.退出\t\t*\n");
        printf("\t\t\t*****************\n");
        printf("\t\t\t请输入你需要操作的菜单:");
        scanf("%d",&choose);
        if(choose==0)
        {
            printf("\t\t\t欢迎下次再使用!\n");
            break;
        }
        switch(choose)
        {
            case 1:
                printf("请输入你需要创建的串:");
                creat(str);///创建串
                printf("主串如下:");
                print(str);///输出主串,提示用户刚才的输入
                printf("请输入要截取的首位置和长度:");
                scanf("%d%d",&start,&len);
                if(getSubStr(str,start,len,sub_str))///操作后对返回值进行判断
                    {
                        ///操作成功
                        printf("截取模式串为:");
                            print(sub_str);
                    }
                else
                    puts("ERROR");///操作失败,提示用户
                break;
            case 2:
                printf("请输入你需要创建的串:");
                creat(str);///创建串
                printf("主串如下:");
                print(str);///输出主串,提示用户刚才的输入
                printf("请输入要删除的首位置和长度:");
                scanf("%d%d",&start,&len);
                if(delSubStr(str,start,len))///根据操作完的返回值进行判断
                    {
                        printf("删除之后的主串:");
                        print(str);
                    }
                else
                    puts("ERROR");///提示用户操作错误
                break;
            case 3:
                printf("请输入你需要创建的第一个串:");
                creat(str);///创建主串
                printf("请输入你需要创建的第二个串:");
                creat(sub_str);///创建子串
                printf("请输入你要在插入第一个串的位置:");
                scanf("%d",&pos);
                if(insSubStr(str,sub_str,pos))///操作后对返回值进行判断
                    {
                        printf("插入之后的第一个主串:");
                        print(str);
                    }
                else
                    puts("ERROR");///提示用户操作错误
                break;
            case 4:
                printf("请输入你需要创建的第一个串:");
                creat(str);
                printf("请输入你需要创建的第二个串:");
                creat(sub_str);
                printf("请输入你要在插入第一个串的位置:");
                scanf("%d",&pos);
                if(repStr(str,sub_str,pos))///操作后对返回值进行判断
                    {
                        printf("交换之后的第一个主串:");
                        print(str);
                    }
                else
                    puts("ERROR");///操作失败提示用户
                break;
            default :printf("输入错误,请重新输入\n");break;
        }
        clear();
    }while(1);


    return 0;
}


///输出串
void print(char *s)
{
    int i;
    for(i=1;i<=s[0];i++)///现在串是从1开始的 0的位置是存长度
        printf("%c",s[i]);
    puts("");
}
///创建串
void creat(char *str)///创建子串,主要是用把之前输入的串赋值到结构体里,并把长度记录下来
{
    /*
    在这里我们要知道一个知识点,\n表示换行符,\0表示字符串结束标识符。
    所以接下来我们用getchar判断结束输入的就是判断它是不是吸收了换行符,而如果用'\0'会死循环
    因为'\n',才是真正的换行符判断,而'\0'只是用来数组输出判断用的,所以输入结束的判断不能用'\0'
    */
    int i=0;
    char ch;
    if((ch=getchar())!='\n')///因为我们上面输入菜单的选择,那么它会进行回车键会被吸收,如果是吸收的是回车键也就忽略了,如果是有用的就存起来,
    ///因为插入和替换的时候都会输入两个串,那么第二个串的第一个字符会被getchar吸入,所以特判是有用的,就存起来
        str[++i]=ch;
    while((ch=getchar())!='\n')///getchar吸收到回车键的时候就结束了
    {
        str[++i]=ch;///i是从1开始存储的
    }
    str[0]=i;///输入完之后,i是它的长度,相应赋值到0的位置
}


///求子串
int getSubStr(char *S,int start,int len,char *sub_str)
{
    int i,j;
    if(len<=0||start>=S[0]||start<=0||len>S[0]-start+1)///子串长度为0或开始位置大于主串的长度或开始位置小于等于0,这些都是错误的
        ///开始的位置到结束的位置大于主串的余下长度也是错误的
        return ERROR;///操作失败返回ERROR
    for(j=start,i=1;i<=len;i++,j++) ///如果len是小于主串start余后的长度就直接赋值它所要求的长度就够,主串肯定是够赋值给它的
        *(sub_str+i)=*(S+j);///赋值操作
    sub_str[0]=len;///把截取的子串的长度赋值到它的0位置
    return OK;///操作成功返回OK
}


///删除子串
int delSubStr(char *S,int start,int len)
{
    int i,j;
    if(start<=0||len<=0||len>S[0]-start+1||start>=S[0])///删除的开始位置小于等于0或要删除的长度小于等于0或删除长度大于主串从开始位置到结束或者开始位置已经大于等于主串的长度
            return ERROR;///操作失败返回ERROR
    for(j=start,i=start+len;i<=S[0];i++,j++)///删除字串也是直接在删除的后面直接覆盖到前面就好了
        *(S+j)=*(S+i);
    S[0]=S[0]-len;///删除之后的主串的长度也要相应减掉那个删除的长度
    return OK;///操作成功返回OK
}


///插入子串
int insSubStr(char *S,char *sub_str,int pos)
{
    int i,j,len;///len是插入位置开始到结束的长度
    char temp[MAXN];
    if(pos>=S[0])///如果开始的位置就大于等于主串的长度,那就根本不能进行插入了
        return ERROR;///操作失败返回ERROR
    ///我的插入思想是:要插入的那个位置开始到结束用一个暂时的字符数组存储,到后面插入完之后,再把这部分赋值过去
    for(len=0,i=pos;i<=S[0];i++)///插入位置开始到结束先用一个数组存储起来
        temp[len++]=*(S+i);
    for(j=1,i=pos;j<=sub_str[0];i++,j++)///把子串插入到主串的操作
        {
            *(S+i)=*(sub_str+j);
        }


    for(j=0,i=pos+sub_str[0];j<len;i++,j++)///把刚才存储的数组现在拼接过来
        *(S+i)=temp[j];
    S[0]=S[0]+sub_str[0];///插入之后要把插入的长度相应增加到主串的长度
    return OK;///操作成功返回OK
}


///置换子串
int repStr(char *S,char *sub_str,int pos)
{
    int i,j;
    if(pos>=S[0])///如果pos的位置已经大于等于主串的长度那就没法衔接过去了
        return ERROR;///操作失败返回ERROR
    for(j=1,i=pos;j<=sub_str[0];i++,j++)///替换操作,直接把进行覆盖就行了
        *(S+i)=*(sub_str+j);///pos+子串的长度之后字符一个一个赋值到pos+1,+2.....就实现了替换
    return OK;///操作成功返回OK
}


///清屏
void clear()
{
    printf("按任意键继续......");
    getch();
    system("cls");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值