본문 바로가기
카테고리 없음

문자열 함수 구현

by ByteBridge 2013. 2. 20.
반응형

#include<iostream>
using namespace  std;
char *Mystrset(char *string, int c);
char *Mystrnset(char *string, int c, unsigned int count);
char *Mystrlwr(char *string);
char *Mystrupr(char *string);
char *Mystrrev(char *string);
char *Mystrchr(const char *string, int c); 
char *Mystrrchr(const char *string, int c);
char *Mystrstr(const char *string, const char *strSearch);
char *Mystrpbrk(const char *string, const char *strCharSet );
char *Mystrtok(char *strToken, const char *strDelimit);
--인쇄관련 문자열함수들--
int Myisprint(int c);//인쇄 가능한 문자
 
int Myisgraph(int c);//공백을 제외한 인쇄 가능한 문자
 
int Myispunct(int c);//인쇄 가능한 문자중 공백과 isalnum을 제외한 문자
 
int Myisspace(int c);//0x09-0x0d,0x20
int main(void)
{
//특정문자로 바꾸기
char src[30]="asdf";
cout<<"특정문자로 바꾸기 :"<<Mystrset(src,'*')<<endl;
//특정문자로 지정한 개수만큼 바꾸기
char src1[30]="asees";
cout<<"지정한 개수만큼 문자 변환 :"<<Mystrnset(src1,'&',3)<<endl;
//대문자를 소문자로 변경하기
char src2[30]="ASDFAS";
cout<<"대문자를 소문자로 변경 :"<<Mystrlwr(src2)<<endl;
//소문자를 대문자로 변경하기
char src3[30]="abcdef";
cout<<"소문자를 대문자로 변경 :"<<Mystrupr(src3)<<endl;
char src4[30]="abcdefghi";
cout<<"문자열을 거꾸로출력: "<<Mystrrev(src4)<<endl;
char*str5="dreamworld";
char*pstr5=Mystrchr(str5,'w');
cout<<"문자열찾기 dreamworld: w 의 위치 :"<<pstr5-str5+1<<endl;
char*str6="seoul gameprogramming";
char*pstr6=Mystrrchr(str6,'p');
cout<<"문자열뒤에서부터 찾기 seoul gameprogramming : p 의위치 "<<pstr6-str6+1<<endl;
char*str7="seoulgameprogramming";
char*pstr7=Mystrstr(str7,"game");
cout<<"문자열 찾기 seoulgameprogramming : game은 :"<<pstr7-str7+1<<" 번째부터 시작문자열"<<endl;
cout<<"문자열 검색 "<<Mystrpbrk("gangnam style","smn")<<endl;
cout<<"    문자열 토큰  (gangnam style dream,world=dreamworld)-->( ,=) "<<endl;
char str[] = "gangnam style dream,world=dreamworld";   //토크나이징대상문자열
char* printStr = NULL;           //문자열출력을위한포인터
char* arrPtr = str;              //문자열배열을char* 변수가받는다.
//Mystrtok 함수의첫번재파라미터로사용하기위함
while ( (printStr = Mystrtok(arrPtr, " ,=")) != NULL )
{
cout << printStr << endl;  //토크나이징한문자열출력
arrPtr = NULL;                          //Mystrtok() 함수의첫번째파라미터를NULL 설정
}     
return 0;
}
//문자열 바꾸기
char *Mystrset(char *string, int c)
{
char* pstring = string;
while(*string !=NULL)
{
*string ++ = c;
}
return pstring;
}
char *Mystrnset(char *string, int c, unsigned int count)
{
char* pdest=string;
if (count>strlen(string))
{
return "개수 지정 오류 : 문자열개수 범위내에서 개수를 지정하세요";
}
for (unsigned int i=0;i<count;i++)
{
string[i]=c;
}
return pdest;
}
//문자열을 소문자로 변환(소문자(a~z)-->97~122)대문자(A~Z)-->65~90)
char *Mystrlwr(char *string)
{
char* pstring = string;
while (*string !=NULL)
{
if(*string >=65 && *string <=90)//65에서90이면 대문자이므로 
*string =*string+32;//32만큼 더하여 소문자로 만들어준다.
*string++;
}
return pstring;
}
//문자열을 대문자로 변환(대문자(A~Z)-->65~90))소문자(a~z)-->97~122)
char *Mystrupr(char *string)
{
char* pstring = string;
while (*string !=NULL)
{
if (*string >=97 && *string <=122)
*string = *string-32;
*string++;
}
return pstring;
}
//문자열을 거꾸로 뒤집는 함수
char *Mystrrev(char *string)
{
//단점... 한글이 안된다.... 어떻게 할거냐>>
if (*string==NULL)
{
return "문자열이없다";
}
char temp;
unsigned int Strlen=strlen(string);
for (unsigned int i=0;i<Strlen/2;i++)//처음문자와 마지막 문자를 바꾸기때문에 문자열길이의 절반까지만 루프를 돌면된다.
{
--
포인터 버전
temp = *(string+i);
*(string+i) = *(string+Strlen-1-i);
*(string+Strlen-1-i)=temp;--
//배열버전
temp=string[i];//임시로 첫번째 문자를 저장
string[i]=string[Strlen-1-i];//널문자를 제외한 마지막 문자
string[Strlen-1-i]=temp;
}
return string;
}
//문자열 내에 지정한 문자가 있는지 검사하고 있을경우 그 문자가 있는 번지를 리턴
//NULL 도 문자로 간주하므로 NULL 문자도 검색 
//문자열이 발견되지않을경우 NULL 을 리턴
///문자열 turbo 의 메모리에 잡힌 시작 번지가 100 번지 이고, 찾고자 하는 문자가 b 라면
///('t'의 주소값을100)이라고가정하고,
//'b' 의 주소값 103 을 받아와서 시작 주소 100 을 빼면 원하는 문자의 위치를 구할 수 있습니다.
char *Mystrchr(const char *string, int c)
{
while(*string !=NULL && *string !=c)//문자열이 NULL 을 만날때까지와 c문자를 만날때까지 루프를 돈다
string ++;
return string ==NULL ? 0 :(char*)string;
//NULL 이면 0을 리턴,아니면 c문자를 만난후부터의 문자를 리턴
//-->const 로 선언하여  char형으로 강제형변환 새켯음
}
//Mystrchr문자열함수와 기능은 같지만 문자열의 뒤에서 부터 찾는다.
char *Mystrrchr(const char *string, int c)
{
char* pstring = (char*)string;
while(*string++); //문자열의 끝까지 루프를 돌린다.
while(--string != pstring && *string !=(char)c); //끝문자열부터 처음위치까지와 c 문자가 같을때까지 루프를 돌린다.
if(*string ==(char)c) //c문자와 같으면 string 을 리턴
return (char*)string;
return 0;
}
//문자열을 검색하는함수 검색대상이 되는 문자열과 검색어가 되는 문자열중 
char *Mystrstr(const char *string, const char *strSearch)
{
int i=0, Searchindex=0;
while(string[i] !=NULL)//문자열이 NULL 전가지 루프
{
if (string[i]==strSearch[Searchindex])//검색하려는 문자열의 첫번째 문자와  같으면
{
if (strSearch[Searchindex+1] == 0)//
{
return (char*)(string+i)-Searchindex;
}
Searchindex++;
}
else
{
Searchindex=0;
}
i++;
}
return NULL;
}
//주어진 문자들의 집합중 하나에 대한 문자열을 찾는 함수
//문자열에서 다른 문자열에 들어있는 문자들을 검색어로 찾는다.이때 가장 첫번째로 일치되는 문자를 가리키는 포인터를 반환
//오른쪽의 문자들중 왼쪽의 문자들과 첫번째로 일치하는 문자를 가리키게된다.
//만약 왼쪽의 널문자이전까지 일치하는것이없으면 NULL을 리턴
//문자열 s1 과 s2가 있을때 문자열 s1내에 문자열 s2에있는 문자중의 하나라도 있는지 검사하고 있을경우 그 포인터를 리턴한다.
//s1="gangnam style" 이고 s2="sml" 일때 s1중 sml 중 한문자라도 발견이 되면 그 번지를 리턴한다.
///이경우에는 style의 s가 먼저 발견되었으므로 s의 포인터를 리턴한다.
char *Mystrpbrk(const char *string, const char *strCharSet )
{
char * tmp;
//NULL 체크 
if (string ==NULL || strCharSet==NULL)
{
return 0;
}
while (*string !=NULL)
{
tmp = (char*)strCharSet;
while (*tmp !=NULL)//tmp 의 문자열이 NULL이 아닐때까지
{
if (*string == *tmp)//string 에 있는 문자열중 tmp 문자와 같으면
{
return tmp;//그문자를 리턴
}
tmp++;
}
string++;
}
}
//문자열을 지정한 토큰들을 대상으로 분리시키는 함수
char *Mystrtok(char *strToken, const char *strDelimit)
{
static char*pCurrent;
char*pDelimit;
if(strToken !=NULL)
pCurrent = strToken;
else
strToken = pCurrent;
if(*pCurrent ==NULL)
return NULL;
//문자열을 점검
while (*pCurrent)
{
//구분자가 있다면 종료문자를 표시하고문자열을 반환
pDelimit=(char*)strDelimit;
while (*pDelimit)
{
if (*pCurrent==*pDelimit)
{
*pCurrent=NULL;
++pCurrent;
return strToken;
}
++pDelimit;
}
++pCurrent;
}
//더이상 구분자가 없으면 NULL반한
return strToken;
}
--인쇄관련 문자열함수들--
int Myisprint(int c);//인쇄 가능한 문자
int Myisgraph(int c);//공백을 제외한 인쇄 가능한 문자
int Myispunct(int c);//인쇄 가능한 문자중 공백과 isalnum을 제외한 문자
int Myisspace(int c);//0x09-0x0d,0x20

반응형