본문 바로가기

Native/C++

[String]str_replace함수의 구현

[String]str_replace함수의 구현
str_replace: 특정 문자열을 바꾸어서 반환한다.

gcc ver:2.95.4
os: linux
compile: gcc -o test test.c
require memory free: yes

[code]
#include <stdio.h>
#include <malloc.h>

int str_replace(char *,char *,char *,char **,int *);

int main(int argc,char **argv){

        char *t="This is --- sample ---.--.-.--.-";
        char *ret;
        char *del="---";
        char *rep="***";
        int len=0;

        str_replace(del,rep,t,&ret,&len);

        printf("Before:%s %d\n",t,strlen(t));
        printf("%s replace to %s\n",del,rep);
        printf("After:%s %d\n",ret,strlen(ret));

        free(ret);

        return 0;

}

int str_replace(char *del,char *rep,char *str,char **ret,int *len){

        int str_len=0;
        int del_len=0;
        int rep_len=0;
        int tmp_len=0;
        int cnt=0;
        int c_cnt=0;
        char *tmp="";
        char *head=str;

        str_len=strlen(str);
        del_len=strlen(del);
        rep_len=strlen(rep);

        for(cnt;cnt<str_len;++cnt){

                if(memcmp(str,del,del_len)==0){

                        tmp_len=strlen(tmp);
                        (*len)=tmp_len+c_cnt+rep_len;

                        if(((*ret)=(char *)malloc(sizeof(char)*(*len)+1))==NULL) return 1;
                        memset((*ret),0x0,sizeof(char)*(*len)+1);

                        memmove((*ret),tmp,tmp_len);
            
                        if(tmp_len>0) free(tmp);

                        memmove((*ret)+tmp_len,head,c_cnt);
                        memmove((*ret)+tmp_len+c_cnt,rep,rep_len);

                        str+=del_len;
                        head=str;
                        
                        c_cnt=0;
                        tmp=(*ret);

                }else{

                        ++str;
                        ++c_cnt;

                }

                if(str_len==c_cnt){

                        if(((*ret)=(char *)malloc(sizeof(char)*str_len+1))==NULL) return 2;
                        memset((*ret),0x0,sizeof(char)*str_len+1);
                        memmove((*ret),str-str_len,str_len);
                        (*len)=str_len;
                        break;

                }

        }

        return 0;

}
[/code]

'Native > C++' 카테고리의 다른 글

[String]stripslashes함수의 구현  (0) 2013.10.02
[String]join함수의 구현  (0) 2013.10.02
[Array]array_push_str함수의 구현  (0) 2013.10.02
[Array]array_push_chr함수의 구현  (0) 2013.10.02
[String]dstr_cat함수의 구현  (0) 2013.10.02