字符串的相关操作

实现方法:

/*--------------------------方法区------------------------*/
Status StringIsEmpty(HString *str);
void InitString(HString *str);
Status StrAssign(HString *str,char *chars);     //串赋值操作
void PrintString(HString *str);     //  打印字符串
Status StrCopy(HString *str1,HString *str2);    //复制 str1 到 str2 中
Status StringCompare(HString *str1,HString *str2);      //比较字符串大小
Status StringConcat(HString *str1,HString *str2,HString *contact);       //连接两个字符串
Status StringSub(HString *cut,HString *str,int stare,int end);      //截取字符串
Status IndexString(HString *father,HString *child,int pos);     //返回从pos位置开始的字串在父串中的位置
void DeleteString(HString *str,int stare,int end);      //删除一定位置上的字符
void InsertString(HString *str,HString *insert,int pos);        //在指定位置插入字符串
void ReplaceString(HString *str,HString myold,HString newstring);       //将str中myold字符串替换为newstring 
void ClearString(HString *str);     //清空字符串
void BFCompare(HString *parent,HString *child,int pos);     //BF算法
void Get_Next(HString *child,int *next);    //返回next数组(部分匹配表)
int KMPCompare(HString *parent,HString *child,int pos);    //KMP算法

.h 文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRUE    1
#define FALSE   0
#define EQ  0
#define GT  1
#define LT  -1
#define OVERFLOW    -2
#define UNDERFLOW   -3
#define MAX_SIZE    1024
#define OK  1
#define ERROR   0

typedef int Status;

typedef struct 
{
    char *ch;
    int length;
}HString;

.c文件:

初始化:

void InitString(HString *str)
{
    str->ch = NULL;
    str->length = 0;
}

字符串赋值:

Status StrAssign(HString *str,char *chars)
{
    int len = strlen(chars);
    if(!len)
    {
        return ERROR;
    }
    str->ch = (char *)malloc(sizeof(char) * len);
    if(!str ->ch)
    {
        exit(OVERFLOW);
    }
    for(int i = 0;i < len;i++)
    {
        str->ch[i] = chars[i];
    } 
    str->length = len;
    return OK;
}

打印字符串内容:

void PrintString(HString *str)
{
    if(str->length == 0 || !str->ch)
    {
        printf("字符串为空\n");
        return ;
    }
    printf("-------------------------输入串为:----------------------\n");
    for(int i = 0;i < str->length;i++)
    {
        printf("%c",str->ch[i]);
    }
    printf("\n");
}

复制str1的内容到str2中:

Status StrCopy(HString *str1,HString *str2)
{
    InitString(str2);
    if(StringIsEmpty(str1))
    {
        printf("父串为空 \n");
        return FALSE; 
    }
    str2->ch = (char *)malloc(sizeof(char) * str1->length);
    if(!str2->ch)
    {
        exit(OVERFLOW);
    }
    printf("---------------------复制元素为:-----------------------\n");
    for(int i = 0;i< str1->length;i++)
    {
        str2->ch[i] = str1->ch[i];
        printf("%c",str2->ch[i]);
    }
    printf("\n");
    str2->length = str1->length;
   
    return OK;
}

判断字符串是否为空:

Status StringIsEmpty(HString *str)
{
    if(str->length == 0 || !str->ch)
    {
        return TRUE;
    }
    return FALSE;
}

字符串比较:

Status StringCompare(HString *str1,HString *str2)
{
    for(int i = 0;i < str1->length && i < str2->length;i++)
    {
        if(str1->ch[i] != str2->ch[i])
        {
            int m = str1->ch[i] - str2->ch[i];
            printf("字符串有不同 : %d\n",m);
            return 0;
        }    
    }
    int n = str1->length - str2->length;
    printf("字符串比较结果为 : %d \n",n);
    return 1;
}

字符串拼接:

Status StringConcat(HString *str1,HString *str2,HString *contact)
{
    InitString(contact);
    contact->length = str1->length + str2->length;
    contact->ch = (char *)malloc(sizeof(char) * contact->length);
    if(!contact->ch)
    {
        exit(OVERFLOW);
    }
    for(int i = 0;i < str1->length;i++)
    {
        contact->ch[i] = str1->ch[i];

    } 
    for(int i = 0;i < str2->length;i++)
    {
        contact->ch[str1->length + i] = str2->ch[i];

    }
    printf("---------------------连接后的串为:------------------------------\n");
    for(int i = 0;i < contact->length;i++)
    {
        printf("%c",contact->ch[i]);
    }
    printf("\n");
    return OK;

}

字符串截取:

Status StringSub(HString *cut,HString *str,int stare,int end)
{
    InitString(cut);

    if(StringIsEmpty(str))
    {
        printf("为空\n");
        return ERROR;
    }
    
    if(stare < 0 || stare > str->length || end < 0 || end > str->length || stare > end)
    {
        return ERROR;
    }
    
    cut->ch = (char *)malloc(sizeof(char) * (end - stare));
    if(!cut->ch)
    {
        printf("退出\n");

        exit(OVERFLOW);
    }
    printf("-----------------截取元素为:----------------------\n");
    for(int i = stare;i < end;i++)
    {
        cut->ch[i] = str->ch[i];
        printf("%c",cut->ch[i]);
    }
    cut->length = end - stare;
    printf("\n");
    return OK;
}

返回从pos位置开始的字串在父串中的位置:

Status IndexString(HString *father,HString *child,int pos)
{
    if(pos < 0)
    {
        return ERROR;
    }
    HString *Substr = (HString *)malloc(sizeof(HString) * 1024);
    InitString(Substr);
    int i = pos;       //记录起始位置
    int j = 0;
    while(i <= father->length)
    {   
        StringSub(Substr,father,i,child->length + j);
        if(StringCompare(Substr,child) != 1)
        {
            i++;
            j++;
           
        }
        else
        {
            printf("位置为:%d\n",i);
            return i;
        }
    }
    free(Substr);
    return 0;
}

删除一定位置上的字符:

void DeleteString(HString *str,int stare,int end)
{
    if(StringIsEmpty(str))
    {
        return ;
    }
    if(stare < 0 || stare > str->length || end < 0 || end >str->length || stare > end)
    {
        return ;
    }
    for(int i = stare - 1;i < end ;i++)
    {
        str->ch[i] = str->ch[i + (end - stare) + 1];
    }
    str->length = str->length - (end - stare + 1);

    printf("删除后的字符串长度为:%d\n",str->length);
    for(int i = 0;i < str->length;i++)
    {
        printf("%c",str->ch[i]);
    } 
    printf("\n");
}

在指定位置插入字符串:

void InsertString(HString *str,HString *insert,int pos)
{
    if(pos < 0 || pos > str->length + 1 || StringIsEmpty(str))
    {
        return;
    }
        str->ch = (char *)realloc(str->ch,(sizeof(char)) * (str->length + insert->length));
        printf("插入后的字符串为:\n");
        for(int i = str->length - 1;i > pos - 1;i--)
        {
            str->ch[i + insert->length] = str->ch[i];

        }
        for(int i = 0;i < insert->length;i++)
        {
            str->ch[i + (pos - 1)] = insert->ch[i];
        }
        str->length = str->length + insert->length;
        printf("长度为:%d\n",str->length);
        for(int i = 0;i < str->length;i++)
        {
            printf("%c",str->ch[i]);
        }
        printf("\n");
}

将str中myold字符串替换为newstring:

void ReplaceString(HString *str,HString myold,HString newstring)
{
    if(StringIsEmpty(str) || StringIsEmpty(&myold));
    int pos = 2;
    DeleteString(str,pos,4);
    InsertString(str,&newstring,2);
    printf("--------------%d\n",pos);    
}

清空字符串:

void ClearString(HString *str)
{
    if(str->ch)
    {
        free(str->ch);
        str->ch = NULL;

    }
    str->length = 0;
}

BF算法:

void BFCompare(HString *parent,HString *child,int pos)
{
    int i = pos;    //父串起始位置
    int j = 1;  //子串起始位置
    while(i <= parent->length && j <= child->length)
    {
        if(parent->ch[i - 1] == child->ch[j - 1])
        {
            i++;
            j++;
        }
        else
        {
            i = i - j + 2;  //回溯到上次匹配的首位的下一位
            j = 1;
        }
       
    }
    if(j > child->length)
    {
        printf("子串在父串的起始位置为:%d\n",i- child->length);
        return ;
    }
    printf("匹配失败\n");

}

返回next数组(部分匹配表):

void Get_Next(HString *child,int *next)
{
    int j = -1;
    int i = 0;
    next[0] = -1;
    while(i < child->length)
    {
        if(j == -1 || child->ch[i] == child->ch[j])
        {
            i++;
            j++;
            next[i] = j;
        }
        else
        {
            j = next[j];
        }
    }
   
    for(int i = 0;i < child->length;i++)
    {
        printf("%d",next[i]);
        printf("\n");

    }

}

KMP算法:

int KMPCompare(HString *parent,HString *child,int pos)
{
    int next[255];
    Get_Next(child,next);
    int i = pos - 1;
    int j = 0;
    while(i < parent->length && j < child->length)
    {
        if(j == -1 || parent->ch[i] == child->ch[j])
        {
            i++;
            j++;
        }
        else
        {
            j = next[j];
        }
    }
    if(j == child->length)
    {
        printf("子串在父串的起始位置为:%d\n",(i + 1) - j);
        return (i + 1) - j;
    }
    printf("匹配失败\n");
    return 0;
}

声明:此文章为学习笔记,如有侵权请联系删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Byte_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值