[String]explode함수의 구현
explode : 문자열을 주어진 문자열을 기준으로 분리한후 배열을 반환한다.
gcc ver: 2.95.4
os: linux
ref: php-4.3.0
compile: gcc -o test test.c
[code]
#include <stdio.h>
#include <malloc.h>
static inline char *memnstr(char *,char *,int,char *);
void explode(char *,char *,char ***,int,int *);
void add_str_array(char ***,char *,int,int);
int main(int argc,char **argv){
char *tt="This is sample";
char **ret;
char *del="";
int arrcnt=0,c=0;
explode(del,tt,&ret,-1,&arrcnt);
for(c;c<arrcnt;++c){
printf("%s arr size is %d\n",ret[c],arrcnt);
}
return 0;
}
static inline char *memnstr(char *haystack,char *needle,int needle_len,char *end){
char *p=haystack;
char ne=needle[needle_len-1];
end-=needle_len;
while(p<=end){
if((p=memchr(p,*needle,(end-p+1)))&&ne==p[needle_len-1]){
if(!memcmp(needle,p,needle_len-1)){
return p;
}
}
if(p==NULL){
return NULL;
}
p++;
}
return NULL;
}
void explode(char *delim,char *str,char ***return_value,int limit,int *arrcnt){
char *p1,*p2,*endp,*res;
endp=str+strlen(str);
p1=str;
p2=memnstr(str,delim,strlen(delim),endp);
if(p2==NULL){
++(*arrcnt);
add_str_array(return_value,p1,strlen(str),*arrcnt);
}else{
do{
++(*arrcnt);
add_str_array(return_value,p1,p2-p1,*arrcnt);
p1=p2+strlen(delim);
}while((p2=memnstr(p1,delim,strlen(delim),endp))!=NULL&&(limit==-1||--limit>1));
if(p1<=endp){
++(*arrcnt);
add_str_array(return_value,p1,endp-p1,*arrcnt);
}
}
}
void add_str_array(char ***return_value,char *str,int str_len,int arrcnt){
char **tmp;
int c=0;
tmp=(char **)malloc(sizeof(char *)*(arrcnt));
for(c;c<(arrcnt)-1;++c){
tmp[c]=(*return_value)[c];
}
tmp[c]=(char *)malloc(sizeof(char)*str_len+1);
memset(tmp[c],0x0,sizeof(char)*str_len+1);
memcpy(tmp[c],str,str_len);
(*return_value)=tmp;
}
[/code]
explode : 문자열을 주어진 문자열을 기준으로 분리한후 배열을 반환한다.
gcc ver: 2.95.4
os: linux
ref: php-4.3.0
compile: gcc -o test test.c
[code]
#include <stdio.h>
#include <malloc.h>
static inline char *memnstr(char *,char *,int,char *);
void explode(char *,char *,char ***,int,int *);
void add_str_array(char ***,char *,int,int);
int main(int argc,char **argv){
char *tt="This is sample";
char **ret;
char *del="";
int arrcnt=0,c=0;
explode(del,tt,&ret,-1,&arrcnt);
for(c;c<arrcnt;++c){
printf("%s arr size is %d\n",ret[c],arrcnt);
}
return 0;
}
static inline char *memnstr(char *haystack,char *needle,int needle_len,char *end){
char *p=haystack;
char ne=needle[needle_len-1];
end-=needle_len;
while(p<=end){
if((p=memchr(p,*needle,(end-p+1)))&&ne==p[needle_len-1]){
if(!memcmp(needle,p,needle_len-1)){
return p;
}
}
if(p==NULL){
return NULL;
}
p++;
}
return NULL;
}
void explode(char *delim,char *str,char ***return_value,int limit,int *arrcnt){
char *p1,*p2,*endp,*res;
endp=str+strlen(str);
p1=str;
p2=memnstr(str,delim,strlen(delim),endp);
if(p2==NULL){
++(*arrcnt);
add_str_array(return_value,p1,strlen(str),*arrcnt);
}else{
do{
++(*arrcnt);
add_str_array(return_value,p1,p2-p1,*arrcnt);
p1=p2+strlen(delim);
}while((p2=memnstr(p1,delim,strlen(delim),endp))!=NULL&&(limit==-1||--limit>1));
if(p1<=endp){
++(*arrcnt);
add_str_array(return_value,p1,endp-p1,*arrcnt);
}
}
}
void add_str_array(char ***return_value,char *str,int str_len,int arrcnt){
char **tmp;
int c=0;
tmp=(char **)malloc(sizeof(char *)*(arrcnt));
for(c;c<(arrcnt)-1;++c){
tmp[c]=(*return_value)[c];
}
tmp[c]=(char *)malloc(sizeof(char)*str_len+1);
memset(tmp[c],0x0,sizeof(char)*str_len+1);
memcpy(tmp[c],str,str_len);
(*return_value)=tmp;
}
[/code]
'Native > C++' 카테고리의 다른 글
[String]addslashes 함수의 구현 (0) | 2013.10.02 |
---|---|
[String]trim함수의 구현 (0) | 2013.10.02 |
[String]stripslashes함수의 구현 (0) | 2013.10.02 |
[String]join함수의 구현 (0) | 2013.10.02 |
[String]str_replace함수의 구현 (0) | 2013.10.02 |