??
1.编写头文件
#define _CRT_SECURE_NO_WARNINGS
//#pragmawarning(disable:4996)
#include
#include
#include
struct CString
{
char *p; //保存字符串首地址
int reallength; //实际长度
};
typedef struct CString mystring;//简写
//原封不动初始化
void init(mystring *string);
//开辟长度,内存清零
void initwithlength(mystring *string, int length);
//初始化并拷贝字符串
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, char * const oldstring, char *const newstring);
2.编写函数实现
#include "mystring.h"
#include "stdio.h"
#include "stdlib.h"
/* 求字符串的长度 */
int mystrlen(char *p)
{
if (p == NULL)
{
return -1;//失败,
}
int length = 0;
while (*p != '\0')//字符串终止条件
{
length++;//长度自增
p++;//指针不断向前
}
return length;
}
/*字符串拷贝 */
char *mystrcpy(char *dest, const char *source)//const限定不被意外修改
{
if (dest == NULL || source == NULL)
{
return NULL;//为空没有必要干活了
}
char * destbak = dest;
while (*source != '\0')//一直拷贝
{
*dest = *source;//赋值字符
source++;
dest++;//指针不断向前,字符挨个赋值
}
*dest = '\0';//结尾
return destbak;//返回地址
}
/*字符串拼接*/
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 * mystrchr(const char *dest, const 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')
{
int flag = 1;//假定是相等
char *findstrbak = findstr;
char *nowdestbak = destbak;
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;
}
void init(mystring *string)
{
string->p = NULL;
string->reallength = 0;//初始化结构体字符串
}
void initwithlength(mystring *string, int length)
{
//string->p =(char *) malloc(sizeof(char)*length);//分配内存
string->p = (char *)calloc(length, sizeof(char));//分配内存并清零
string->reallength = length;//长度
}
void initwithstring(mystring *string, char *copystring)
{
int length = strlen(copystring);//获取字符串长度
string->p = (char *)calloc(length + 1, sizeof(char));//分配内存
mystrcpy(string->p, copystring);//拷贝字符串
string->reallength = length + 1;//设置长度
}
vo