C語言實現像高級語言一樣的字符串操作(一)

如何用C語言操作字符串,像高級語言一樣靈活的操作,字符串的長度任意變呢?答案是肯定的,而且更靈活,效率更高!

下面實現strcpy與strcat函數的結合體

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//定義結構體,聲明變量的時候必須要賦初值
//比如string str={0,0,0};
typedef struct{
    size_t memlen;//內存長度
    size_t strlen;//字符長度
    char* str;//字符串,後面有'\0'
}string;

//本模塊所有的函數在變量不用時,都需要釋放內存
void strfree(string *src)
{
    if(src->memlen){//如果已經申請過了內存
        src->memlen=src->strlen=0;
        free(src->str);
    }
}

//構建字符串,strSRC字符串在定義char *strSRC=0;必須要初始化成0
//因爲第二次要用realloc函數分配內存了
//本函數支持strcpy_free(&t1,t1.str,3);也就是說把自邊往後移3位
void strcpy_free(string *dest,char *sour,size_t start)
{
    char *src=sour;//定義新變量,用於自身複製到自身時
    size_t len=strlen(src)+1;//新字符的長度
    if(start>dest->strlen)start=dest->strlen;//如果傳入的起始位置大於原來的長度
    if(len==1){//如果src="",可以直接用desc->str[xx]=0;與dest->strlen=start;來代替
        if(dest->strlen){//原來有內容
            dest->str[start]=0;
            dest->strlen=start;
        }
    }
    else{
        int isFree=0;//是否需要釋放內存
        if(dest->memlen==0){//如果第1次賦值
            len+=start;//整長度加上起始位置
            dest->str=(char*)malloc(len);//分配內存
            dest->memlen=len;//內存長度
        }
        else{
            if(src>=dest->str && src<=dest->str+start){//內存地址有重疊,可能是自身複製到自身
                src=(char*)malloc(len);//分配原來的長度
                strcpy(src,sour);//先把原來的數據複製到臨時變量中
                isFree=1;//需要釋放臨時分配的內存
            }

            len+=start;//整長度加上起始位置
            if(dest->memlen<len){//內存擴容
                dest->str=(char*)realloc(dest->str,len);
                dest->memlen=len;
            }
        }
        strcpy(&dest->str[start],src);//複製字符串
        dest->strlen=len-1;//字符長度

        if(len<=dest->memlen/2){//如果新內存空間,只有原來的1半時
            dest->memlen/=2;//截斷1半,爲了節省了內存空間
            dest->str=(char*)realloc(dest->str,dest->memlen);
        }

        if(isFree)free(src);//釋放臨時分配的內存
    }
}


int main(int argc,char*argv[])
{
    string t1={0,0,0};//必須要初始化爲{0,0,0}

    //1.連接兩個字符串
    strcpy_free(&t1,"Hello! My Good ",0);
    printf("%s\n",t1.str);
    strcpy_free(&t1,"Friends.~~",t1.strlen);
    printf("%s\n",t1.str);
    strcpy_free(&t1,t1.str,7);
    printf("%s\n",t1.str);
    strcpy_free(&t1,"abcd",1);
    printf("%s\n",t1.str);

    strfree(&t1);//釋放內存
}

程序運行的結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章