【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; i
      
      
       
       length+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; i
       
       
        
        data[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; i
        
        
          data != 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); 
        
       
       
      
      
     
     
    
    
运行效果


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值