c语言中字符串的封装,【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);

运行效果

a11593b94487132d78a92a03790db79d.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值