封装 字符串

<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>

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SteveRocket

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值