用C编写一个自己的string库文件_01

自己的string库(C)

写自己的库中要对内存分配有足够的了解和对观察内存
要不然会很蛋疼。我就是这样,刚开始调试了好久没观察内存
没调好,第二天晚上通过观察内存调好了
观察内存变化很重要
在编写的过中 出现很多错误调试内存多次才成功
先看文件目录
这里写图片描述
结果
这里写图片描述

废话不多说看代码

MString.h

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

struct _string
{
    char *p;
    int length;
};

typedef struct _string _mstring;

//字符串的初始化,添加 删除 修改
void init(_mstring *mstring);//初始化字符串
void initwithlength(_mstring *mstring,int length);//初始化字符
void initwithstring(_mstring *mstring, char *ch);//初始化并赋值
void printfstring(_mstring *mstring);//打印字符串
void addstringback(_mstring *mstring, char *ch);//添加字符串到尾部
void addcharback(_mstring *mstring, char ch);//添加字符到尾部
char * findfirstchar(_mstring *mstring, char ch);//查找第一个字符
char * findfirststring(_mstring *mstring, char *ch);//查找第一个字符串
int delfirstchar(_mstring *mstring, char ch);//删除第一个字符
int delfirststring(_mstring *mstring, char *ch);//删除第一个字符串
void addchar(_mstring *mstring, char ch,char *pos);//任意位置插入字符
void addstring(_mstring *mstring, char *ch, char *pos);//任意位置插入字符串
void changechar(_mstring *mstring, char ch, char pos);//删除字符
void changestring(_mstring *mstring, char *ch, char *pos);//删除字符串

_msting.c


#include"MString.h"
char * _mstrcat(char *dest, const char *source)
{
    char *start = dest;
    if (dest == NULL && source == NULL)
    {
        return NULL;
    }
    else
    {
        while (*dest != '\0')
        {
            dest++;
        }
        while (*source != '\0')
        {
            *dest = *source;
            source++;
            dest++;
        }
        *dest = '\0';
    }
}
//获取字符串的长度
int _mstrlen(const char *ch)
{
    int length = 0;
    if (ch == NULL)
    {
        return 0;
    }
    else
    {
        while (*ch++)
        {
            length++;
        }
    }
    return length;
}
//写一个自己的拷贝字符串的方法 const 的意思是不要在拷贝过程中被修改
char * _mstrcpy(char *dest, const char *soucre)
{
    char *start = dest;
    if (dest == NULL || soucre == NULL)
    {
        return NULL;
    }
    else
    {
        while (*soucre!='\0')
        {
            *dest = *soucre;
            dest++;
            soucre++;
        }
    }
    *dest = '\0';//把结尾赋值结束字符
    return start;//返回地址
}
//查找第一个字符
char *_mystrchr(char *dest, const char find)
{

    while (*dest!='\0')
    {

        if (*dest == find)
        {
            return dest;
        }
        dest++;
    }
    return NULL;
}
//查找字符串
char *_mystrstr(const char *  const dest, const char * const find)
{
    if (dest == NULL || find == NULL)
    {
        return NULL;
    }
    char *destbak = dest;
    char *p = NULL;
    while (*destbak != '\0')
    {
        int flag = 1;
        char *findbak = find;
        char *nowdestbak = destbak;
        while (*findbak != '\0')
        {
            if (*nowdestbak != '\0')
            {
                if (*findbak != *nowdestbak)
                {
                    flag = 0;
                }
                nowdestbak++;
                findbak++;
            }
            else
            {
                flag = 0;
                break;
            }

        }
        if (flag == 1)
        {
            p = destbak;
            return p;
        }
        destbak++;
    }
    return NULL;

}
//删除字符
int _mydelchar(_mstring *mstring, char ch)
{
    if (ch == NULL || mstring == NULL)
    {
        return 0;
    }
    char *p = _mystrchr(mstring->p,ch);
    char *pnext = p + 1;
    while (*pnext != '\0')
    {
        *p = *pnext;
        p++;
        pnext++;
    }
    *p = '\0';//把最后一位赋值为0
    return 1;

}
//删除字符串
int _mydelstring(_mstring *mstring, char *ch) 
{
    if (ch == NULL || mstring == NULL)
    {
        return 0;
    }
    //_mystrchr(mstring->p, ch);
    //printf("%s", mstring->p);
    char *p = _mystrstr(mstring->p, ch);
    if (p == NULL)
    {
        return 0;
    }
    int length = _mstrlen(ch);
    char *pnext = p + length;
    while (*pnext != '\0')
    {
        *p = *pnext;

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



//无参数初始化 字符串
void init(_mstring *mstring)
{
    mstring->p = NULL;
    mstring->length = 0;
}
//初初始化字符串的长度 
//为啥用calloc 不用malloc 因为caloc 会把内容初始化为0
void initwithlength(_mstring *mstring, int length)
{
    mstring->p = (char *)calloc(length, sizeof(char));
    mstring->length = length;
}
void initwithstring(_mstring *mstring, char *ch)
{   //+1 是存放 '\0'
    int length = _mstrlen(ch);
    mstring->p = (char *)calloc(length+1, sizeof(char));
    _mstrcpy(mstring->p, ch);
    mstring->length = length+1;

}
void printfstring(_mstring *mstring)
{
    printf("string = %s,length = %d,sizeof = %d\n", mstring->p,mstring->length,sizeof(mstring->p));
}
//最后位置加入字符串
void addstringback(_mstring *mstring, char *ch)
{
    int needlength = _mstrlen(ch);//需要的长度
    int nowlength = _mstrlen(mstring->p);
    if (nowlength + needlength + 1 > mstring->length)
    {
        int length = nowlength + needlength + 1;
        mstring->p = (char *)realloc(mstring->p, mstring->length+length);
        _mstrcat(mstring->p, ch);
        mstring->length += needlength;
    }
    else
    {
        strcat(mstring->p, ch);
    }
    //printf("%d", mstring->length);
}
//在最后一个地方添加字符
void addcharback(_mstring *mstring, char ch)
{
    int l = _mstrlen(mstring->p);
    int m = mstring->length;
    if ( l+ 1 == m)
    {
        //重新分配内存 参数为原来字符串地址和 一共需要多少长度 4 + 1

        mstring->p = (char *)realloc(mstring->p, mstring->length +1);
        mstring->length += 1;
        //mstring->length = 5
        // 1 2 3 a 0 0 

        mstring->p[mstring->length - 2] = ch;
        //上次出错是因为没有 0 结束字符断点查找 最后的0字符很难找错误从内存才能看出
        mstring->p[mstring->length - 1] = '\0';
        //printf("%d",mstring->length);
    }
    else
    {
        //printf("%d\n", mstring->length);
        //printf("%d", _mstrlen(mstring->p));
        int length = _mstrlen(mstring->p);
        mstring->p[length] = ch;
        mstring->p[length + 1] = '\0';
    }
    //printf("%d", mstring->length);
}
//查找第一个字符
char * findfirstchar(_mstring *mstring, const char ch)
{
    return _mystrchr(mstring->p, ch);
}
//查找第一个字符串
char * findfirststring(_mstring *mstring, const char *ch)
{
    //char *p = strstr(mstring->p, ch);
    return _mystrstr(mstring->p, ch);
}
//删除字符
int delfirstchar(_mstring *mstring, char ch)
{

    return _mydelchar(mstring,ch);
}
//删除字符串
int delfirststring(_mstring *mstring, char *ch)
{
    return _mydelstring(mstring,ch);
}
//任意位置 插入字符
void addchar(_mstring *mstring, char ch, char *pos)
{
    if (ch == NULL || pos == NULL)
    {
        return;
    }
    int nowlength = _mstrlen(mstring->p);
    int movelength = _mstrlen(pos);
    //内存不够分配内存
    if (_mstrlen(mstring->p) + 1 > mstring->length)
    {
        mstring->p = (char *)realloc(mstring->p, mstring->length + 1);
        mstring->length += 1;
        for (int i = nowlength; i > nowlength - movelength; i--)
        {
            mstring->p[i] = mstring->p[i - 1];
        }
        mstring->p[nowlength - movelength] = ch;
        mstring->p[nowlength + 1] = '\0';
    }
    else
    {
        for (int i = nowlength; i > nowlength - movelength; i--)
        {
            mstring->p[i] = mstring->p[i - 1];
        }
        mstring->p[nowlength - movelength] = ch;
        mstring->p[nowlength + 1] = '\0';
    }

}
//替换字符
void changechar(_mstring *mstring, char ch, char newchar)
{
    char * pstr = mstring->p;
    while (*pstr!='\0')
    {
        if (*pstr == ch)
        {
            *pstr = newchar;

        }
        pstr++;
    }
    //printf("%s",mstring->p);

}
void changestring(_mstring *mstring, char *ch, char *newch)
{
    char * pfind = findfirststring(mstring, ch);
    if (*pfind != NULL)
    {
        delfirststring(mstring, ch);
        addstring(mstring, newch, pfind);
    }
}
//任意位置 插入字符串
void addstring(_mstring *mstring, char *ch, char *pos)
{
    int nowlengtht = _mstrlen(mstring->p);//8
    int addlength = _mstrlen(ch);//4
    //printf("%d", mstring->length);
    if (nowlengtht + addlength + 1 > mstring->length)
    {


        int temp = _mstrlen(ch);
        int t = (mstring->length);
        int needlength = nowlengtht + temp - t ;

        mstring->p = (char *)realloc(mstring->p, mstring->length + needlength);
        mstring->length += needlength;

        //printf("%d", sizeof(mstring->p));
        int nowlength = _mstrlen(mstring->p);//8
        int movelength = _mstrlen(pos);
        int insertlength = _mstrlen(ch);//4
        int mm = nowlength - movelength;
        int nn = nowlength;
        for (int i =  nn; i >= mm; i--)
        {
            mstring->p[i + insertlength] = mstring->p[i];
        }

        //printf("%x",mstring->p);
        for (int j = 0; j < insertlength; j++)
        {
            mstring->p[nowlength - movelength + j] = ch[j];
        }
    //  mstring->p[nowlength + 1] = '\0';
        //printf("222");

    }
    else
    {

        int movelength = _mstrlen(pos);
        int nowlength = _mstrlen(mstring->p);
        int insertlength = _mstrlen(ch);
        for (int i = nowlength; i > nowlength - movelength; i--)
        {
            mstring->p[i + insertlength] = mstring->p[i];
        }
        for (int j = 0; j < insertlength; j++)
        {
            mstring->p[nowlength - movelength + j] = mstring->p[j];
        }
        mstring->p[nowlength + 1] = '\0';
    }
}

main.c

#include<stdio.h>
#include<stdlib.h>
#include"MString.h"
int main()
{


    _mstring mstring;
    initwithstring(&mstring, "123");
    printfstring(&mstring);
    addcharback(&mstring, 'a');
    printfstring(&mstring);


    addstringback(&mstring,"hello");
    printfstring(&mstring);

    char *p = findfirstchar(&mstring,'l');


    if (p != NULL)
    {
        //addchar(&mstring, 'A', p);
            addstring(&mstring, "AAAA", p);

    }
    printfstring(&mstring);
    changechar(&mstring, 'h', '9');

    changestring(&mstring, "AA","BB");
    printfstring(&mstring);
    //delfirstchar(&mstring,'e');
    /*delfirststring(&mstring, "ll");
    printfstring(&mstring);*/
    system("pause");
    return 0;
}

以上代码都是自己一点点的写的,错误一点点的处理,出现错误的时候要冷静 慢慢地调试就会好的

发布了18 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/INTKILOW/article/details/68931833