ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 문자열 함수 구현
    카테고리 없음 2013. 2. 20. 01:53
    반응형

    #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

    반응형
Designed by Tistory.