Native/C++
[String]trim함수의 구현
aucd29
2013. 10. 2. 18:56
[String]trim함수의 구현
Trim : 문자열의 맨앞과 끝에 있는 "\n", "\r", "\t", "\v", "\0" 들을 제거한다.
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>
/*
* 1번째 인자
* 대상 문자열
* 2번째 인자
* 대상 문자열의 길이
* 3번째 인자
* mode 1 : trim left
* mode 2 : trim right
* mode 3 : trim left and right
* 4번째 인자
* 소거하고자 하는 문자 또는 문자열
* 5번째 인자
* 소거하고자 하는 문자 또는 문자열의 길이
* 6번째 인자
* 리턴값->이값이 정의되었을경우 함수자체에서는 리턴값을 돌려주지 않는다.
*/
char *Trim(unsigned char *,int,int,char *,int,char **);
int CharMask(char *,int ,char *);
int main(int argc,char **argv){
char *tstStrNew;
unsigned char tstStr[]=" This is test string . ";
int tstStrLen=0,tstStrNewLen=0;
tstStrLen=strlen(tstStr);
tstStrNew=Trim(tstStr,tstStrLen,3,NULL,0,NULL);
tstStrNewLen=strlen(tstStrNew);
printf("Before: %s %d\n",tstStr,tstStrLen);
printf("After: %s %d\n",tstStrNew,tstStrNewLen);
return 0;
}
char *Trim(unsigned char *str,int len,int mode,char *str_list,int str_list_len,char **ret){
register int i;
int str_len=0;
int trimmed = 0;
char mask[256];
char *tmp;
if(str_list){
CharMask(str_list,str_list_len,mask);
}else{
CharMask(" \n\r\t\v\0",6,mask);
}
if(mode&1){
for(i=0;i<len;i++){
if(mask[(unsigned char)str[i]]){
trimmed++;
}else{
break;
}
}
len-=trimmed;
str+=trimmed;
}
if(mode&2){
for(i=len-1;i>=0;i--){
if(mask[(unsigned char)str[i]]){
len--;
}else{
break;
}
}
}
if(ret){
(*ret)=(char *)malloc(sizeof(char)*len+1);
memset((*ret),0x0,sizeof(char)*len+1);
memmove((*ret),(char *)str,len);
}else{
tmp=(char *)malloc(sizeof(char)*len+1);
memset(tmp,0x0,sizeof(char)*len+1);
memmove(tmp,(char *)str,len);
return tmp;
}
return "";
}
int CharMask(char *input,int len,char *mask){
char *end;
char c;
int result=0;
memset(mask,0,256);
for(end=input+len;input<end;input++){
c=*input;
if((input+3<end)&&input[1]=='.'&&input[2]=='.'&&input[3]>=c){
memset(mask+c,1,input[3]-c+1);
input+=3;
}else if((input+1<end)&&input[0]=='.'&&input[1]=='.'){
if(end-len>=input){
result=1;
continue;
}
if(input+2>=end){
result=2;
continue;
}
if(input[-1]>input[2]){
result=3;
continue;
}
result=4;
continue;
}else{
mask[c]=1;
}
}
return result;
}
[/code]
Trim : 문자열의 맨앞과 끝에 있는 "\n", "\r", "\t", "\v", "\0" 들을 제거한다.
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>
/*
* 1번째 인자
* 대상 문자열
* 2번째 인자
* 대상 문자열의 길이
* 3번째 인자
* mode 1 : trim left
* mode 2 : trim right
* mode 3 : trim left and right
* 4번째 인자
* 소거하고자 하는 문자 또는 문자열
* 5번째 인자
* 소거하고자 하는 문자 또는 문자열의 길이
* 6번째 인자
* 리턴값->이값이 정의되었을경우 함수자체에서는 리턴값을 돌려주지 않는다.
*/
char *Trim(unsigned char *,int,int,char *,int,char **);
int CharMask(char *,int ,char *);
int main(int argc,char **argv){
char *tstStrNew;
unsigned char tstStr[]=" This is test string . ";
int tstStrLen=0,tstStrNewLen=0;
tstStrLen=strlen(tstStr);
tstStrNew=Trim(tstStr,tstStrLen,3,NULL,0,NULL);
tstStrNewLen=strlen(tstStrNew);
printf("Before: %s %d\n",tstStr,tstStrLen);
printf("After: %s %d\n",tstStrNew,tstStrNewLen);
return 0;
}
char *Trim(unsigned char *str,int len,int mode,char *str_list,int str_list_len,char **ret){
register int i;
int str_len=0;
int trimmed = 0;
char mask[256];
char *tmp;
if(str_list){
CharMask(str_list,str_list_len,mask);
}else{
CharMask(" \n\r\t\v\0",6,mask);
}
if(mode&1){
for(i=0;i<len;i++){
if(mask[(unsigned char)str[i]]){
trimmed++;
}else{
break;
}
}
len-=trimmed;
str+=trimmed;
}
if(mode&2){
for(i=len-1;i>=0;i--){
if(mask[(unsigned char)str[i]]){
len--;
}else{
break;
}
}
}
if(ret){
(*ret)=(char *)malloc(sizeof(char)*len+1);
memset((*ret),0x0,sizeof(char)*len+1);
memmove((*ret),(char *)str,len);
}else{
tmp=(char *)malloc(sizeof(char)*len+1);
memset(tmp,0x0,sizeof(char)*len+1);
memmove(tmp,(char *)str,len);
return tmp;
}
return "";
}
int CharMask(char *input,int len,char *mask){
char *end;
char c;
int result=0;
memset(mask,0,256);
for(end=input+len;input<end;input++){
c=*input;
if((input+3<end)&&input[1]=='.'&&input[2]=='.'&&input[3]>=c){
memset(mask+c,1,input[3]-c+1);
input+=3;
}else if((input+1<end)&&input[0]=='.'&&input[1]=='.'){
if(end-len>=input){
result=1;
continue;
}
if(input+2>=end){
result=2;
continue;
}
if(input[-1]>input[2]){
result=3;
continue;
}
result=4;
continue;
}else{
mask[c]=1;
}
}
return result;
}
[/code]