说明
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);
运行效果