//用於malloc的臨時內存區
char *tmp;
char *new_tmp_str=dest;
int new_tmp_str_len=0; //new_tmp_str相對於dest地址開始處的長度
//開始循環替換src串中符合pattern的子串為newstr
while(!rtn)
{
reg_rtn_struct_var=cns_reg(new_tmp_str, pattern);
rtn = reg_rtn_struct_var.rtn;
pstart = reg_rtn_struct_var.pstart;
pend = reg_rtn_struct_var.pend;
if(!rtn)
{
//分配新的空間: strlen(newstr):新串長 pend-pstart:舊串長
tmp=(char*)calloc(sizeof(char), strlen(dest)+strlen(newsubstr)-(pend-pstart)+1 );
//把src內的前new_tmp_str_len+pstart個內存空間的數據,拷貝到arr
strncpy(tmp, dest, new_tmp_str_len+pstart);
//標識串結束
tmp[new_tmp_str_len+pstart]='\0';
//連接arr和newstr, 即把newstr附在arr尾部, 從而組成新串(或說字符數組)arr
strcat(tmp, newsubstr);
//把src中 從oldstr子串位置後的部分和arr連接在一起,組成新串arr
strcat(tmp, new_tmp_str+pend);
//把用malloc分配的內存,復制給指針dest
dest = strdup(tmp);
//釋放malloc分配的內存空間
free(tmp);
new_tmp_str_len = new_tmp_str_len + pstart + strlen(newsubstr);
new_tmp_str=dest+new_tmp_str_len;
}
}
return dest;
}
int main()
{
//測試正則表達式
char str[]="1love2love3love4love5love6love!";
reg_rtn_struct reg_rtn_struct_var;
char *newstr=cns_str_ereplace(str,".?.?ve","..");
puts(newstr);
//return 0;
}