如何用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);//釋放內存
}
程序運行的結果