【C/C++】C语言字符串库封装

说明

1.内存大小自动适应字符串长度。

2.字符串/字符获取长度、查找、插入、删除、替换、拷贝、连接。

3.使用strFree(CString*)释放字符串占用内存。


源码

#ifndef _STRLIB_H_
#define _STRLIB_H_
#include 
#include 

//字符串结构体
struct CString{
	char* data;
	int length;
	int size;
};

//获取字符串长度
int strLength(const char* str){
	if (str == NULL)
	{
		return -1;
	}
	int len = 0;
	for(;*str; ++len, ++str);
	return len;
}

// 字符串拷贝
//copyLen默认为0,表示完整拷贝src
int strCopy(char* str, const char* src, const int copyLen = 0){
	if (str == NULL || src == NULL)
	{
		return -1;
	}

	int srcLen = strLength(src);
	srcLen = copyLen == 0 || copyLen > srcLen ? srcLen : copyLen;
	// 拷贝
	for (int i=0; ilength+1 == str->size;
}

//字符串的初始化
void strInit(CString* str){
	str->data = (char*)calloc(1,sizeof(char));	
	str->length = 0;
	str->size = 1;
}

void strInitWithStr(CString* str, char* src){
	strInit(str);
	int srcLen = strLength(src);
	// 分配内存
	str->data = (char*)calloc(srcLen+1,sizeof(char)); //使用calloc分配的内存空间自动清零
	// 拷贝字符串
	strCopy(str->data,src);
	// 更新字符串的length和size
	str->length = srcLen;
	str->size = srcLen+1;
}

//添加字符
void strAddChar(CString* str, char ch){	
	// 如果满了
	if (strIsFull(str))
	{
		// 修改内存空间大小
		realloc(str->data,++(str->size));
	}
	++(str->length);	
	str->data[str->length-1] = ch;
	str->data[str->length] = '\0';	
}

//添加字符串
void strAddStr(CString* str, const char* src){
	if (src == NULL)
	{
		return;
	}
	// 判断空间是否足够
	int srcLen = strLength(src);
	int offset = str->length+srcLen+1 - str->size; // 计算不足的内存空间大小
	if (offset > 0) // 如果空间不足
	{
		// 修改内存空间大小
		realloc(str->data, str->size += offset);
	}
	// 连接两个字符串
	strLinked(str->data,src);
	str->length += srcLen;
}

//在字符串指定位置(位置从0开始)插入字符
int strInsertChar(CString* str, char ch, int pos){	
	if (pos < 0 || pos >= str->length)
	{
		return -1;
	}
	// 如果满了
	if (strIsFull(str))
	{
		// 增加内存空间大小
		realloc(str->data,++(str->size));
	}
	++(str->length);	

	// 移动字符
	for (int i = str->length; i>pos; --i)
	{
		str->data[i] = str->data[i-1];
	}
	// 插入字符
	str->data[pos] = ch;

	return 1;
}

//在字符串指定位置(位置从0开始)插入字符串
int strInsertStr(CString* str, const char* src, int pos){
	if (pos < 0 || pos >= str->length)
	{
		return -1; // 插入位置不正确
	}

	// 判断空间是否足够
	int srcLen = strLength(src);
	int offset = str->length+srcLen+1 - str->size; // 计算不足的内存空间大小
	if (offset > 0) // 如果空间不足
	{
		// 修改内存空间大小
		realloc(str->data, str->size += offset);
	}
	str->length += srcLen;

	int pos2 = pos + srcLen -2; // 插入的字符串的结尾在新串中的索引
	// 移动字符
	for (int i = pos2,j=0; i>=pos; --i,++j)
	{
		str->data[str->length-j] = str->data[i];
	}
	// 插入字符串
	for (int i=0; idata[pos+i] = src[i];
	}	

	return 1;
}

// 删除字符串
int strDeleteStr(CString* str, char* const src){
	if (src == NULL)
	{
		return 0;
	}

	// 查找字符串的位置
	char* p = strFind(str->data, src);
	if (p == NULL)
	{
		return 0;
	}

	int srcLen = strLength(src);		
	char* p2 = p + srcLen; //替换的串的结束位置的后一位

	//把后面的字符向前移动
	for (int i=0; *(p2+i); ++i)
	{
		*(p+i) = *(p2+i); //如果没有到结束位置,则把后面字符往前移
	}

	// 更新字符串长度与size
	str->length -= srcLen;	
	// 修改内存空间大小
	realloc(str->data, str->size=str->length+1);
	//结束符
	str->data[str->length] = 0;

	return 1;
}

//删除所有指定字符串
void strDeleteAllStr(CString* str, char* const src){
	while (strDeleteStr(str,src));	
}

// 替换指定字符
int strReplaceChar(CString* str, const char oldCh, const char newCh){

	if (oldCh == newCh)
	{
		return 0;
	}

	char* p = strFind(str->data,oldCh);
	if (p == NULL)
	{
		return 0;
	}

	*p = newCh;

	return 1;
}

// 替换指定字符串
int strReplaceStr(CString* str, char* const oldStr, char* const newStr){

	if (oldStr == newStr)
	{
		return 0;
	}

	// 查找目标字符串位置
	char* p = strFind(str->data, oldStr);
	if (p == NULL)
	{
		return 0;
	}

	int oldLen = strLength(oldStr);	
	int newLen = strLength(newStr);

	for (int i=0; idata != NULL)
	{
		free(str->data);		
		str->data = NULL;
		str->length = 0;
		str->size= 0;
	}	
}

#endif
	CString str;

	// 初始化一个空字符串
	strInit(&str);
	// 在字符串末尾添加一个字符
	strAddChar(&str, 'n');
	// 在字符串末尾添加一个字符串
	strAddStr(&str, "otepad");

	//打印字符串信息
	printf("str=\"%s\", length=%d, size=%d \n", str.data, str.length, str.size);
	
	// 在字符串索引为6的位置插入一个字符
	strInsertChar(&str,'a',5);
	printf("str=\"%s\", length=%d, size=%d \n", str.data, str.length, str.size);

	// 在字符串索引为7的位置插入一个字符串
	strInsertStr(&str,"bbb",7);
	printf("str=\"%s\", length=%d, size=%d \n", str.data, str.length, str.size);

	// 删除所有指定字符串
	strDeleteAllStr(&str,"bb");
	printf("str=\"%s\", length=%d, size=%d \n", str.data, str.length, str.size);

	// 替换所有指定字符串
	strReplaceAllStr(&str,"bd","fff");
	printf("str=\"%s\", length=%d, size=%d \n", str.data, str.length, str.size);

	// 释放内存
	strFree(&str);
运行效果


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值