C语言: 字符串 -3

自定义字符串函数实现:

头文件:

/*
	自定义字符串库头文件 MyString.h
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/*
    字符串结构体
    参数: P: 字符串首地址         
    参数  realLenght:字符串实际长度        
*/
struct CString
{
    char *p; //保存字符串首地址
    int realLenght; //字符串实际长度
};

//结构体取一个别名
typedef struct CString mystring;

//初始化
void init(mystring *string);
//初始化,并分配指定长度存储空间,且内存清零
void initWithLenght(mystring *string,int lenght);
//初始化,并拷贝字符串
void initWithString(mystring *string , char *copystring);
//打印字符串
void printfString(mystring *string);
//尾部增加字符
void backAddChar(mystring * string,char ch);
//尾部增加字符串
void backAddString(mystring * string, char * str);
//执行字符串指令
void run(mystring *string);
//返回字符串中查找字符的第一个匹配字符
char * findFirstChar(mystring *string, char ch);
//返回字符串中查找字符串的第一个匹配字符串
char * findFirstString(mystring *string, char *str);
//删除字符中字符
int deletefirstChar(mystring *string, const char ch);
//删除字符串中字符串
int deletefirstString(mystring *string, char* const str);

//任意位置增加字符
void AddChar(mystring * string, char ch,char * pos);
//任意位置增加字符串
void AddString(mystring * string, char * str, char * pos);

//替换字符
void changeFirstChar(mystring * string, const char oldChar, const char newChar);

//替换字符串
void changeFirstString(mystring * string, const char* oldStr, const char* newStr);

函数实现:

#define _CRT_SECURE_NO_WARNINGS
#include"MyString.h"
#include<string.h>

//求字符串长度
//参数:*p 字符串首地址
int myStrlen(char *p)
{
    if (p == NULL)
    {
        return -1; //字符串为空
    }
    int lenght = 0;
    while (*p!='\0') //字符串终止条件
    {
        lenght++; //长度自增
        p++; //指针自增
    }
    return lenght;
}

//字符串拷贝
//参数:*dest  To String
//参数:*source  from String 加const 限定源被意外修改
char* myStrcpy(char* dest, const char* source)
{
    if (dest == NULL || source == NULL)
    {
        return NULL;
    }

    char * destBak = dest;
    while (*source!='\0')
    {
        *dest = *source;
        dest++;
        source++;
    }
    *dest = '\0'; //添加结束符
    return destBak; //返回首地址
}

//字符串连接相加
//参数:*dest  源字符串
//参数:*source  要相加的字符
char * myStrCat(char * dest, const char * source)
{
    if (dest == NULL || source == NULL)
    {
        return NULL;
    }
    else
    {
        char * destBak = dest; //备份
        while (*dest!='\0')
        {
            dest++;
        }
        while (*source!='\0')
        {
            *dest = *source;
            dest++;
            source++;
        }
        *dest = '\0'; //添加结束符

        return destBak;
    }
}


char *mystrchar(const char * dest, char ch)
{
    if (dest == NULL)
    {
        return NULL;
    }

    while (*dest!='\0')
    {
        if (*dest == ch)
        {
            return dest;
        }
        dest++;
    }
    return NULL;
}

//查找字符串中是否包含字符串
char * myStrstr(const char* const dest, const char * const findStr)
{
    if (dest == NULL || findStr == NULL)
    {
        return NULL;
    }
    char * destbak = dest;
    char *p = NULL; //保存找到的地址
    while (*destbak!='\0') //外层循环,源
    {
        char * findStrbak = findStr;
        char *nowdestbak = destbak; //备份查找地址
        int flag = 1; //假定相同
        while (*findStrbak!='\0') //内层循环,要查找的字符串
        {
            if (*nowdestbak != '\0')
            {
                if (*findStrbak != *nowdestbak)
                {
                    flag = 0;//不同赋值为0
                }
                nowdestbak++;
                findStrbak++;
            }
            else
            {
                flag = 0;
                break;
            }
            
        }
        if (flag == 1)
        {
            p = destbak;//当前位置
            return p;
        }
        destbak++;
    }
    
    return NULL;

}



//返回字符串中查找字符的第一个匹配字符
//参数:*string  结构体数据类型
//参数:ch  要找的字符
char * findFirstChar(mystring *string, char ch)
{
    char *p = mystrchar(string->p, ch);
    return p;
}


//返回字符串中查找字符串的第一个匹配字符串
char * findFirstString(mystring *string, char *str)
{
    char *value = myStrstr(string->p, str);
    return value;
}

//初始化,原始值
//参数:*string  结构体数据类型
void init(mystring *string)
{
    string->p = NULL;
    string->realLenght = 0;
}

//初始化,并分配指定长度存储空间,且内存清零
//参数:*string  结构体数据类型
//参数:lenght  数据长度
void initWithLenght(mystring *string, int lenght)
{
    //string->p = (char *)malloc(sizeof(char)*lenght); //malloc分配内存时,内存空间不为0,有脏数据
    string->p = (char *)calloc(lenght, sizeof(char)); //分配内存,并清零。
    string->realLenght = lenght;
}


//初始化,并拷贝字符串
//参数:*string  结构体数据类型
//参数:*copystring  要复制的字符串
void initWithString(mystring *string, char *copystring)
{
    int lenght = myStrlen(copystring); //获取字符串长度,但不包括字符串结束符'\0'
    string->p =(char *) calloc(lenght + 1, sizeof(char)); //分配内存空间
    myStrcpy(string->p, copystring); //拷贝字符串
    string->realLenght = lenght + 1; //长度加1,切记
}


//打印字符串
//参数:*string  结构体数据类型
void printfString(mystring *string)
{
    printf("\nString : %s", string->p);
}

//尾部增加字符
//参数:*string  结构体数据类型
//参数:ch  要增加的字符
void backAddChar(mystring * string,char ch)
{
    if (myStrlen(string->p) + 1 == string->realLenght) //字符串长度已满
    {
        string->p = realloc(string->p, string->realLenght + 1); //增加内存存储空间
        string->realLenght += 1; //长度加1
        string->p[string->realLenght - 2] = ch;
        string->p[string->realLenght - 1] = '\0';
    }
    else
    {
        int nowLenght = myStrlen(string->p);
        string->p[nowLenght] = ch;
        string->p[nowLenght + 1] = '\0';
    }
}

//尾部增加字符串
//参数:*string  结构体数据类型
//参数:*str  要增加的字符串
void backAddString(mystring * string, char * str)
{
    int nowMyStrlen = myStrlen(string->p); //获取当前字符串长度
    int addStrlen = myStrlen(str); //获取要增加的字符串长度

    if (nowMyStrlen + addStrlen + 1 > string->realLenght) //判定长度是否越界
    {
        int needAddlen = nowMyStrlen + addStrlen + 1 - (string->realLenght); //获取需要添加的内存长度
        string->p = (char *)realloc(string->p, needAddlen+(string->realLenght));
        myStrCat(string->p, str); //拷贝字符串
        string->realLenght += needAddlen; //增加长度
    }
    else
    {
        myStrCat(string->p, str); //拷贝字符串
    }
}

//执行字符串指令
//参数:*string  指令字符串
void run(mystring *string)
{
    system(string->p);
}

//删除字符中字符
//参数:*string  结构体数据类型
//参数:ch  要删除的字符
//return  : 1 成功 0 失败
int deletefirstChar(mystring *string, const char ch)
{
    
    char *p = mystrchar(string->p, ch);
    if (p == NULL)
    {
        return 0;
    }
    else
    {
        char *pNext = p + 1;
        while (*pNext != '\0')
        {
            *p = *pNext;
            p++;
            pNext++;
        }
        *p = '\0';
        return 1;
    }
   
}


//删除字符串中字符串
//参数:*string  结构体数据类型
//参数:str  要删除的字符串
//return  : 1 成功 0 失败
int deletefirstString(mystring *string, char * const str)
{
    char *p = myStrstr(string->p, str);
    if (p == NULL)
    {
        return 0;
    }
    else
    {
        int lenght = myStrlen(str);//求字符串长度
        char* pNext = p + lenght;
        while (*pNext!='\0')
        {

            *p = *pNext;
            p++;
            pNext++;
        }
        *p = '\0';
        return 1;
    }

}

//任意位置增加字符
void AddChar(mystring * string, char ch, char * pos)
{
    if (string == NULL || pos == NULL)
    {
        return;
    }
    if (myStrlen(string->p) + 1 == string->realLenght) //内层满了
    {
        string->p = realloc(string->p, string->realLenght + 1);
        string->realLenght += 1;
        int nowLen = myStrlen(string->p);//求出当前长度
        int moveLen = myStrlen(pos); //求出要移动的长度
        for (int i = nowLen; i > nowLen - moveLen; i--)
        {
            string->p[i] = string->p[i - 1]; //轮询 向后移动
        }
        string->p[nowLen - moveLen] = ch;
        string->p[nowLen + 1] = '\0';

    }
    else
    {
        int nowLen = myStrlen(string->p);//求出当前长度
        int moveLen = myStrlen(pos); //求出要移动的长度
        for (int  i = nowLen; i > nowLen-moveLen; i--)
        {
            string->p[i] = string->p[i - 1]; //轮询 向后移动
        }
        string->p[nowLen - moveLen] = ch;
        string->p[nowLen + 1] = '\0';
    }


}

//任意位置增加字符串
void AddString(mystring * string, char * str, char * pos)
{
    if (string == NULL || pos == NULL)
    {
        return;
    }
    int nowMyStrlen = myStrlen(string->p); //获取当前字符串长度
    int addStrlen = myStrlen(str); //获取要增加的字符串长度

    if (nowMyStrlen + addStrlen + 1 > string->realLenght) //判定长度是否越界
    {
        int needAddlen = nowMyStrlen + addStrlen + 1 - (string->realLenght); //获取需要添加的内存长度
        string->p = (char *)realloc(string->p, needAddlen + (string->realLenght));
        string->realLenght += needAddlen;//增加长度
        int nowLen = myStrlen(string->p); //当前长度
        int moveLen = myStrlen(pos); //求出要移动的长度
        int insertLen = myStrlen(str);//插入字符串长度
        for (int i = nowLen; i > nowLen - moveLen; i--)
        {
           string->p[i + insertLen]= string->p[i]; //向后移动
        }
        for (int j = 0; j < insertLen; j++)
        {
            string->p[nowLen - moveLen + j] = str[j];
        }

    }
    else
    {
        int nowLen = myStrlen(string->p); //当前长度
        int moveLen = myStrlen(pos); //求出要移动的长度
        int insertLen = myStrlen(str);//插入字符串长度
        for (int i = nowLen; i > nowLen - moveLen; i--)
        {
            string->p[i + insertLen] = string->p[i]; //向后移动
        }
        for (int j = 0; j < insertLen; j++)
        {
            string->p[nowLen - moveLen + j] = str[j];
        }

    }

}

//替换
void changeFirstChar(mystring * string, const char oldChar, const char newChar)
{
    char *pstr = string->p;
    while (*pstr!='\0')
    {
        if (*pstr == oldChar) //查找
        {
            *pstr = newChar; //赋值
            return;
        }
        pstr++;
    }
}

//替换字符串
void changeFirstString(mystring * string, const char* oldStr, const char* newStr)
{
    char * find = findFirstString(string, oldStr); //找到位置
    if (find != NULL)
    {
        deletefirstString(string, oldStr); //删除原来的
        AddString(string, newStr, find); //插入新的
    }
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值