静态串操作实现

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 80
typedef struct String
{
    char data[MAXSIZE];
    int size;
}String,*string;

void InitStr(string str)
{
    char ch;
    if(str==NULL)
    {
        str=(string)malloc(sizeof(String));
    }
    scanf("%c",&ch);
    str->size=0;

    while(ch!='/n'&&str->size<MAXSIZE)
    {
        str->data[str->size]=ch;
        str->size++;
        scanf("%c",&ch);
    }
    str->data[str->size]='/0';
}

void StrAssign(string str,char* s)
{
    int i=0;
    char* p;
    p=s;
    while(*p!='/0')
    {
        str->data[i]=*p;
        i++;
        p++;
    }
    str->data[i]='/0';
    str->size=i;
}

void StrCopy(string str,string source)
{
    int i=0;
    str->size=source->size;
    while(i<source->size)
    {
        str->data[i]=source->data[i];
        i++;
    }
    str->data[i]='/0';
}

int StrEmpty(string str)
{
    return !(!(str->size));
}

int  StrCompare(string str,string str2)
{
    int i;
    int res;
    i=0;res=0;
    while(i<str->size&&i<str2->size)
    {
        if(str->data[i]==str2->data[i])
        {
            i++;continue;
        }
        if(str->data[i]>str2->data[i])
        {
            res=1;
            return res;
        }
        else
        {
            res=-1;
            return res;
        }
    }
    if(str->size==str2->size)
        return res;
    if(str->size>str2->size)
        return 1;
    else
        return -1;
}

int StrLength(string str)
{
    return str->size;
}

void ClearString(string str)
{
    str->data[0]='/0';
    str->size=0;
}

void Concat(string des,string src1,string src2)
{
    int i;
    des->size=src1->size+src2->size;
    for(i=0;i<src1->size;i++)
    {
        des->data[i]=src1->data[i];
    }
    for(i=0;i<src2->size;i++)
    {
        des->data[src1->size+i]=src2->data[i];
    }
    des->data[des->size]='/0';
}

void SubString(string res,string src,int pos,int len)
{
    int i;
    if(pos<=0||pos+len>src->size)
    {
        printf("Illegal pos!Out of range/n");
        return ;
    }
    res->size=len;
    for(i=0;i<len;i++)
    {
        res->data[i]=src->data[pos+i];
    }
    res->data[i]='/0';
}

int Index(string src,string res,int pos)
{
    int i,j,flag;
    if(pos<=0||pos+res->size>src->size)
    {
        printf("Illegal pos!Out of range/n");
        return -1;
    }
    for(i=pos;i+res->size<=src->size;i++)
    {
        flag=1;
        for(j=0;j<res->size;j++)
        {
            if(res->data[j]!=src->data[j+i])
            {
                flag=0;
                break;
            }
        }
        if(flag==1)
            break;
    }
    if(flag==1)
        return i+1;
    else
        return -1;
}

void StrInsert(string src,string news,int pos)
{
    int len;
    int i,j;

    len=news->size;
    if(pos>src->size||pos<0)
    {
        printf("Wrong position,Insert failed./n");
        return ;
    }
    for(i=src->size;i>=pos;i--)
    {
        src->data[i+len]=src->data[i];
    }
    for(j=0;j<len;j++)
    {
        src->data[pos+j]=news->data[j];
    }
}

void StrDelete(string src,int pos,int len)
{
    int i,j;

    for(i=pos;i<=src->size-len;i++)
    {
        src->data[i]=src->data[i+len];
    }
}

void Replace(string src,string olds,string news)
{
    int i,j,k=0,cnt=0;
    int pos[80];
    i=1,j=0;
    while(i<src->size&&k!=-1)
    {
        k=Index(src,olds,i);
        pos[j++]=k;
        cnt++;
        i=olds->size+k;
    }
    if(pos[0]==-1)
    {
        printf("No string /"%s/" is found,so no string is replaced./n",olds);
        return ;
    }
    printf("%d string /"%s/" is replaced by /"%s/"/n",cnt-1,olds,news);
    i=0;
    printf("It's found at these position:/n");
    while(pos[i]!=-1)
    {
        printf("%d/t",pos[i]) ;
        i++;
    }

    for(i=cnt-2;i>=0;i--)
    {

        StrDelete(src,pos[i]-1,olds->size);
        StrInsert(src,news,pos[i]-1);
    }
    printf("/n");
}

void Print(string str)
{
    if(str->size==0)
    {
        printf("String is Empty!/n");
        return ;
    }
    printf("%s/n",str->data);
}
int main()
{
    string ms;
    string name;
    string name2;
    int length;
    ms=(string)malloc(sizeof(String));
    name=(string)malloc(sizeof(String));
    name2=(string)malloc(sizeof(String));
    InitStr(ms);
    InitStr(name);
    InitStr(name2);
/*
    StrCopy(name2,name);
    StrDelete(ms,5,3);
    Print(ms);
    StrInsert(ms,name,4);
    Print(ms);
    ClearString(name);
    Print(name);
    StrAssign(name,"hzy");
    Print(name);
    Concat(name2,ms,name);
    Print(name2);
    SubString(name,name2,4,5);
    Print(name);
    length=StrLength(name2);
    printf("name2's length is %d/n",length);
    printf("Hello, world/nsize is %d/n",ms->size);
*/

/*
    length=StrCompare(name2,name);
    if(length==0)
        printf("Equal/n");
    else if(length==-1)
        printf("%s is lower than %s/n",name2,name);
    else
        printf("%s is bigger than %s/n",name2,name);
    length=StrCompare(name2,ms);
    if(length==0)
        printf("Equal/n");
    else if(length==-1)
        printf("%s is lower than %s/n",name2,ms);
    else
        printf("%s is bigger than %s/n",name2,ms);

    length=Index(ms,name,5);
    if(length==-1)
        printf("%s is not found in %s start from %d/n",name,ms,5);
    else
        printf("%s is found in %s at position %d/n",name,ms,length);
    length=Index(ms,name,8);
    if(length==-1)
        printf("%s is not found in %s start from %d/n",name,ms,8);
    else
        printf("%s is found in %s at position %d/n",name,ms,length);
*/
    Replace(ms,name,name2);
    Print(ms);
    getch();
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值