自己的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;
}
以上代码都是自己一点点的写的,错误一点点的处理,出现错误的时候要冷静 慢慢地调试就会好的