본문 바로가기

old drawer/C, C++, MFC

[C] strtok함수를 이용한 문자열 자르기[펌]

1. 함수의 원형
 
    char *strtok(char *strToken, const char *strDelimit);
 
 
2. 함수의 기능
 
    strToken 변수에 문자열의 주소가 명시되면 해당 문자열의 처음 위치에 존재하는
    토큰(token)을 찾아서 해당 주소를 반환하고, strToken에 NULL이 명시되면
    토큰 찾기가 진행중이라는 뜻이고 현재 진행상태에서 다음에 해당하는 토큰을
    찾아서 그 주소를 반환한다.
 
 
3. 함수의 매개변수에 대한 설명
 
    3.1 strToken

        한개 이상의 토큰을 포함하고 있는 문자열의 시작 주소를 명시한다.
        만약, 이미 호출한 문자열에서 다음 위치에 해당 하는 토큰을 찾는 경우,
        NULL로 명시한다.
 
    3.2 strDelimit

        구분문자(delimiter)들로 구성된 문자열의 시작 주소를 명시한다.
        구분문자는 각각의 토큰을 구별하는 기준 문자이다.
        예) "Hello-World"라는 문자열에서 "Hello"와 "World"를 각각 토큰으로
            구분하고 싶은경우에 '-'을 구분문자로 사용하면 된다.
 
 
4. 함수의 반환값
 
    토큰을 포함하는 문자열에서 이전에 찾은 토큰의 다음 위치에 존재하는
    토큰의 시작 주소를 반환한다.

    예) "Hello-World+Tipssoft"라는 문자열에서 '-'와 '+'를 구분문자로
        사용하여 "Hello", "World", "Tipssoft"를 각각 토큰으로 얻고
        싶다면 다음과 같이 사용하면 된다.
 
        char string[] = "Hello-World+Tipssoft";

        // string 문자열 배열에서 H에 해당하는 주소가 반환된다.
        char *p_token = strtok(string, "-+");

        // "Hello" 토큰을 찾은 상태에서 호출했고 strToken에 NULL을 사용했으므로
        // 다음 토큰 위치에 해당하는 "World"를 찾겠다는 뜻이므로 string 문자열
        // 배열에서 W에 해당하는 주소가 반환된다.
        p_token = strtok(NULL, "-+");
 
    그리고 NULL이 반환되었다면 더이상 찾을 토큰이 없다는 뜻이다.
 
 
5. 함수 사용시 주의사항
 
    strtok 함수는 사용상의 편의를 위해서 현재 토큰을 찾는데 사용한 구분문자를
    NULL로 변경한다. 즉, 사용자가 지정한 문자열을 필요에 따라서 함수가 임의로
    수정한다는 뜻이다. 따라서 원본이 수정되는것을 막으려면 복사본을 만들고
    이 함수를 사용하는 것이 좋다.
 
    // (표현의 편리를 위해 NULL 문자를 0이라고 표시한다.)
    char string[] = "Hello-World+Tipssoft";
    char *p_token = strtok(string, "-+");

    // 이 시점에서 string 내용은 "Hello0World+Tipssoft"로 변경되었을 것이다.
    // 따라서 p_token이 string 변수의 'H'에 해당하는 주소를 가지고 있으므로
    // 화면에 Hello 라고 출력될 것이다.
    printf("%s\n", p_token);
    p_token = strtok(NULL, "-+");

    // 이 시점에서 string 내용은 "Hello0World0Tipssoft"로 변경되었을 것이다.
    // 따라서 p_token이 string 변수의 'W'에 해당하는 주소를 가지고 있으므로
    // 화면에 World 라고 출력될 것이다.
    printf("%s\n", p_token);
 
    strToken에 명시한 문자열에 구분문자가 토큰앞에 한개이상 연속적으로 사용되는
    경우, 해당 구분문자는 모두 무시된다. 예를들어, "++--Hello-+-+World"라는
    문자열에서 구분문자를 "-+"로 지정하고 토큰을 찾는 경우에 "Hello" 앞에 있는
    "++--"와 "World"앞에 있는 "-+-+(또는, +-+)" 구분문자는 무시된다.
    따라서 "Hello"의 'o'다음에 있는 '-'만이 구분문자로 사용될 것이다.
 
    // (표현의 편리를 위해 NULL 문자를 0이라고 표시한다.)
    char string[] = "++--Hello-+-+World";
    char *p_token = strtok(string, "-+");

    // 이 시점에서 string 내용은 "++--Hello0+-+World"로 변경되었을 것이다.
    // 따라서 p_token이 string 변수의 'H'에 해당하는 주소를 가지고 있으므로
    // 화면에 Hello 라고 출력될 것이다. ( ++-- 는 무시됨 )
    printf("%s\n", p_token);
    p_token = strtok(NULL, "-+");

    // p_token이 string 변수의 'W'에 해당하는 주소를 가지고 있으므로
    // 화면에 World 라고 출력될 것이다. ( +-+ 는 무시됨 )
    printf("%s\n", p_token);
 
    바로 위 예제에서 string의 최종 변경된 상태는 아래와 같다. 즉, strtok 함수는
    꼭 필요한 구분문자만 NULL로 변경해서 사용한다.
 
    "++--Hello0+-+World"
 
    마지막으로 이 함수는 내부적으로 정적 변수를 이용해서 구현되었기 때문에
    동시에 두가지 이상의 문자열에서 토큰을 찾기 위해 사용하면 데이터의 충돌이나
    원하지 않는 결과값을 얻을수 있다. 하지만 여러개의 스레드에서 이 함수를
    각각 개별적으로 호출하는 경우에는 문제가 발생하지 않는다.
 
 
6. 함수의 사용 예제
 
    #include "string.h"
    #include "stdio.h"
    void main()
    {
        char string[] = "Hello-World+Tipssoft,Example";
        char delimit_string[] = "+-,";
        char *p_token = NULL;
        p_token = strtok(string, delimit_string);
        while(p_token != NULL){
            printf("%s\n", p_token);
            p_token = strtok(NULL, delimit_string);
        }
    }  
 
    출력 결과
 
    Hello
    World
    Tipssoft
    Example

tipsoft에서 구해온 정보 프로그램하는 사람이라면 기본적으로 알아둬야 하는 정보다
공부하다 막히면 난 항상 tipsoft에서 조언얻고 해결하곤한다.
http://www.tipssoft.com 여기가면 mfc 나 winAPI c++ 에 관한 정보르 얻을수 있다.


<출처> http://momokoo.tistory.com/m/post/view/id/7