<span style="font-family:Microsoft YaHei;font-size:18px;">string.h</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//字符串的封装
typedef struct CString
{
char *p;//保存字符串首地址
int realLength;//字符串实际长度
}mystring;
//初始化
void init(mystring*string);
void initWithLength(mystring*string,int length);//开辟长度 内存清0
void initWithString(mystring*string,char*copystring);//初始化字符串 并拷贝
//显示字符串
void showString(mystring*string);
//实现库函数 获取字符串长度
int mystrlen(char*p);
//字符串拷贝
char *mystrcpy(char*dest, const char*source);
char*mystrcat(char*dest, const char*source);
//增加 插入 字符、字符串
void backAddChar(mystring*string, char ch);
void backAddString(mystring*string, char*str);
//内部字符串当做指令来处理
void run(mystring*string);
//查找字符串中第一个找到的字符 strchr
char*findFirstChar(mystring*string, char ch);
char*mystrchr(const char*dest, const char ch);
//查找字符串 strstr
char*findFirstString(mystring*string, char*str);//返回第一个找到的字符串地址
char*mystrstr(const char*dest, const char*findstr);
//删除字符、字符串
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 poldstr, char*const pnewstr);</span>
<span style="font-family:Microsoft YaHei;font-size:18px;">-------------------------------------------------------------------------------------------------------</span>
<span style="font-family:Microsoft YaHei;font-size:18px;">string.c</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">#include "string.h"
//初始化
void init(mystring*string)
{
string->p = NULL;
string->realLength = 0;
}
void initWithLength(mystring*string, int length)//开辟长度 内存清0
{
string->p = (char*)calloc(length,sizeof(char));//分配内存并清0
string->realLength = length;
}
void initWithString(mystring*string, char*copystring)//初始化字符串 并拷贝
{
if (NULL==string)
{
printf("字符串为空,无法拷贝\n");
return 0;
}
int length = strlen(copystring);//获取字符串长度
string->p = (char*)calloc(length + 1, sizeof(char));//由于此处的calloc已经全部初始化为0 所以下面的操作不需要考虑字符串结束标志
//strcpy(string->p, copystring);//拷贝字符串
mystrcpy(string->p, copystring);
string->realLength = length + 1;//设置长度
}
//显示字符串
void showString(mystring*string)
{
printf("showString = %s\n", string->p);
}
//获取字符串长度
int mystrlen(char*p)
{
int length = 0;
if (NULL==p)
{
printf("字符串为空\n");
return 0;
}
while (*p != '\0')
{
length++;
p++;
}
return length;
}
//字符串拷贝
char *mystrcpy(char*dest, const char*source)
{
if (NULL==dest&&NULL==source)
{
printf("字符串为空\n");
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||!source)
{
printf("字符串为空,插入失败\n");
return NULL;
}
else
{
char*destbak = dest;//保留地址
while ((*destbak++) != '\0');//指针前移
while ((*dest++) != '\0')//循环并拷贝字符串
{
*dest++=*source++;
}
*dest = '\0';
return destbak;
}
}
//内部字符串当做指令来处理
void run(mystring*string)
{
system(string->p);//执行指令
}
//查找字符串中第一个找到的字符 strchr
char*findFirstChar(mystring*string, char ch)
{
//char*p = strchr(string->p, ch);//使用库函数
char*p = mystrchr(string->p, ch);//使用自定义函数
return p;
}
char*mystrchr(const char*dest, const char ch)
{
if (NULL==dest)
{
return NULL;
}
while (*dest++!='\0')
{
if (*dest==ch)
{
return dest;//找到 就返回地址
}
}
return NULL;//没找到返回NULL
}
//查找字符串 strstr
char*findFirstString(mystring*string, char*str)//返回第一个找到的字符串地址
{
//char*pres = strstr(string->p, str);
char*pres = mystrstr(string->p, str);
return pres;//返回找到字符串的地址
}
char*mystrstr(const char*const dest, const char*const findstr)//避免传递过来的字符串以及地址被随便修改
{
//判断为空 很重要
if (NULL==dest||NULL==findstr)
{
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;//不等
}
}
else
{
flag = 0;
break;
}
}
if (1==flag)
{
p = destbak;
return p;
}
destbak++;
}
return NULL;
}
//删除字符、字符串
int deleteFirstChar(mystring*string, const char ch)
{
//查找
char*pstr = mystrchr(string->p, ch);
if (NULL==pstr)
{
return 0;
}
char*pnext = pstr + 1;
//双指针循环
while (*pnext!='\0')
{
*pstr++ = *pnext++;//ok
}
*pstr = '\0';
return 1;
}
int deleteFirstString(mystring*string, char*const str)
{
char*pres = mystrstr(string->p, str);
if (NULL==pres)
{
return 0;
}
else
{
int length = mystrlen(str);//字符串长度
char*pnext = pres + length;
while (*pnext!='\0')
{
*pres++ = *pnext++;
}
*pres = '\0';//字符串结尾结束标志
return 1;
}
}
//尾部增加 字符、字符串
void backAddChar(mystring*string, char ch)
{
if (strlen(string->p) + 1 == string->realLength)
{
//重新分配内存
string->p = realloc(string->p, string->realLength + 1);
string->realLength += 1;
string->p[string->realLength - 2] = ch;
string->p[string->realLength - 1] = '\0';
}
else
{
int nowlength = mystrlen(string->p);//求出当前长度
string->p[nowlength] = ch;
string->p[nowlength + 1] = '\0';
}
}
void backAddString(mystring*string, char*str)
{
int nowmyStringLength = mystrlen(string->p);//获取当前字符串长度
int addStringLength = mystrlen(str);//要增加字符串的长度
if (nowmyStringLength + addStringLength + 1 > string->realLength)
{
int needAddLength = nowmyStringLength + addStringLength + 1 - string->realLength;
//分配内存
string->p = (char*)realloc(string->p, string->realLength + needAddLength);//增加字符串长度
mystrcat(string->p, str);//字符串拼接
string->realLength += needAddLength;//增加长度
}
else
{
mystrcat(string->p, str);//拼接字符串
}
}
//任意位置增加(字符、字符串) 根据地址
void addChar(mystring *string, char ch, char *pos)
{
if (NULL == pos||NULL==string)
{
return NULL;
}
if (mystrlen(string->p)+1==string->realLength)
{
//重新分配内存
string->p = realloc(string->p, string->realLength + 1);
string->realLength += 1;
int nowlength = mystrlen(string->p);
int movelength = mystrlen(pos);
for (int i= nowlength; i>nowlength-movelength; i--)
{
string->p[i] = string->p[i - 1];
}
string->p[nowlength - movelength] = ch;//插入
}
else
{
int nowlength = mystrlen(string->p);//求出当前长度
int movelength = mystrlen(pos);//求出现在要移动的长度
for (int i = nowlength; i > nowlength - movelength; i--)
{
string->p[i] = string->p[i - 1];
}
string->p[nowlength - movelength] = ch;
string->p[nowlength+1] = '\0';
}
}
void addString(mystring*string, char *str, char*pos)
{
if (NULL==pos||NULL==string)
{
return;
}
int nowmystringlength = mystrlen(string->p);//获取当前长度
int addstringlength = mystrlen(str);//要增加的字符串长度
if (nowmystringlength+addstringlength+1>string->realLength)//判断是否
{
//int needaddlength = nowmystringlength + addstringlength + 1-(string->p);
string->p = (char*)realloc(string->p, string->realLength + needaddlength);
string->realLength += needaddlength;//增加长度
int nowlength = mystrlen(string->p);//求出当前的长度
int movelength = mystrlen(pos);//求出现在要移动的长度
int insertlength = mystrlen(str);//要求出插入的长度
for (int i = nowlength; i >=nowlength-movelength ;i++)
{
string->p[i + insertlength] = string->p[i];//字符移动
}
for (int j = 0; j < insertlength;j++)
{
string->p[nowlength - movelength+j] = str[j];//赋值拷贝
}
}
else
{
int nowlength = mystrlen(string->p);//求出当前的长度
int movelength = mystrlen(pos);//求出现在要移动的长度
int insertlength = mystrlen(str);//要求出插入的长度
for (int i = nowlength; i >= nowlength - movelength; i++)
{
string->p[i + insertlength] = string->p[i];//字符移动
}
for (int j = 0; j < insertlength; j++)
{
//
string->p[nowlength - movelength + 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;//如果套替换所有的字符 去掉return即可
}
pstr++;
}
}
void changeFirstString(mystring*string, char*const poldstr, char*const pnewstr)
{
char*pfind = findFirstString(string,poldstr);
if (NULL!=pfind)
{
deleteFirstString(string, poldstr);
addString(string, pnewstr, pfind);
}
}</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">----------------------------------------------------------------------------------------------------</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">测试代码main.c</span>
<span style="font-family:Microsoft YaHei;font-size:18px;"></span><pre name="code" class="cpp"><strong>#include "string.h"
void main1()
{
mystring string1;
//函数内部改变外部变量 需要地址
initWithString(&string1,"mynameisrocket");
showString(&string1);
printf("字符串长度:%d\n", mystrlen(&string1));
getchar();
}
void main2()
{
mystring string1;
// initWithString(&string1, "cal");
// showString(&string1);
// //增加字符
// backAddChar(&string1, 'c');
// run(&string1);
//增加字符串
initWithString(&string1, "note");
showString(&string1);
backAddString(&string1, "pad");
showString(&string1);
run(&string1);
getchar();
}
//测试字符查找函数 strchr
void main3()
{
mystring string1;
initWithString(&string1, "calaaaa");
showString(&string1);
//修改 将找到的一个字符a改为A
char*pstr = findFirstChar(&string1, 'a');
*pstr = 'A';
showString(&string1);
getchar();
}
//测试strstr mystrstr
void main4()
{
mystring string1;
initWithString(&string1, "calaaaa");
showString(&string1);
char *pstr = findFirstString(&string1, "laz");
// printf("查找:%s\n", *pstr);//error
printf("查找:%s\n", pstr);
if (pstr!=NULL)
{
*pstr = 'Z';
}
showString(&string1);
getchar();
}
//删除(字符、字符串)依赖于查找
void main5()
{
mystring string1;
initWithString(&string1, "abcdabcdaa");
showString(&string1);
//删除第一个指定的字符
deleteFirstChar(&string1, 'b');
showString(&string1);
//删除第一个指定的字符串
deleteFirstString(&string1, "abc");
showString(&string1);
getchar();
}
//测试增加字符 增加字符串
void main6()
{
mystring string1;
initWithString(&string1, "note");
showString(&string1);
backAddString(&string1, "abcd1234");
showString(&string1);
char*p = findFirstChar(&string1, 'a');
if (NULL!=p)
{
addChar(&string1, 'Z', p);
}
showString(&string1);
getchar();
}
//任意位置修改字符 字符串
void main()
{
mystring string1;
initWithString(&string1, "notepadnote");
showString(&string1);
//changeFirstString(&string1, "note", "calc");
//替换所有符合条件的字符串
while (findFirstString(&string1,"note"))
{
changeFirstString(&string1, "note", "12345");
}
showString(&string1);
getchar();
}</strong>