언어 자료구조 알고리즘/C11 표준 라이브러리 함수

strtok 함수 [C언어 표준 라이브러리 함수 가이드]

언제나휴일 2016. 1. 3. 15:27
반응형

strtok


헤더 파일

[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - string.h


char * strtok ( char * str, const char * delimeters); 대상 문자열에서 delimeters를 기준으로 분할하는 함수

 
입력 매개 변수 리스트
str 대상 문자열, 처음은 대상 문자열을 전달하고 이후에는 NULL을 전달
delimeters 분할 기준 문자들이 있는 문자열
반환 값
처음 delimeters의 문자가 있는 위치를 반환, 없을 때 NULL 반환
 
strtok 함수는 delimeters 내에 포함하고 있는 문자가 처음 위치한 곳을 탐색하여 반환하는 함수입니다.
그런데 이 함수는 처음 호출할 때는 첫번째 인자로 대상 문자열을 전달하지만 그 이후에는 NULL을 대입합니다.
만약 호출 중간에 원본 문자열의 내용을 바꾸면 정상적인 동작을 하지 않습니다.
특히 스레드를 이용한 프로그래밍에서는 원하지 않는 결과를 초래할 수 있습니다.
C11 에서는 이러한 문제를 개선한 strtok_s를 제공합니다.
 
사용 예
//C언어 표준 라이브러리 함수 사용법 가이드
//char * strtok ( char * str, const char * delimeters); 대상 문자열에서 delimeters를 기준으로 분할하는 함수
//대상 문자열에서 delimeters로 분할한 문자열 목록 출력
 
#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>
 
char * ehstrtok(char * str, const char * delimeters)
{
    static char *pos = NULL;
    static char buffer[256];
    int len,len2;
    int i,j;
 
    if (str)//입력 인자가 NULL이 아니면
    {
        pos = str;//pos에 설정
    }
 
    len = strlen(pos);//posl 문자열 길이 계산
    len2 = strlen(delimeters);//delimeters 문자열 길이 계산
 
    //delimeters와 다른 문자가 나올 때까지 반복
    for (i = 0; i < len; i++)
    {
        for (j = 0; j < len2; j++)
        {
            if (pos[i] == delimeters[j])//pos[i] delimeters[j]가 같으면
            {               
                break;//반복문 탈출(j<len2)
            }
        }
        if (j == len2)//같은 것이 없으면
        {
            break;//반복문 탈출
        }
    }
   
    pos = pos + i;//pos delimeters와 다른 문자가 처음나온 위치로 설정
   
    for (i = 0; i < len; i++)
    {
        for (j = 0; j < len2; j++)
        {
            if (pos[i] == delimeters[j])//pos[i] delimeters[j]가 같으면
            {
                break;//반복문 탈출(j<len2)
            }
        }
        if (j < len2)//delimeters에 같은 문자가 있으면
        {
            strncpy(buffer, pos, i);//부분 문자열 복사
            buffer[i] = 0;//종료 문자 대입
            pos = pos + i+1;//pos 위치는 다음으로 이동
            return buffer;//복사한 문자열 반환
        }
    }
   
    return NULL;
}
int main (void)
{
    char str[200] ="나는 집에  간다. 그리고, C언어로 프로그램을 작성한다. 화이팅! 언제나 휴일";
    char str2[200] = "다시 한 번 테스트! 이번에는 ehstrtok 함수 사용.";
    char *delimeters = " ,.!";
    char * pos;
 
    printf("원본: %s\n",str);
    //strtok 함수 이용
    printf("== 공백이나 콤마, 느낌표, 마침표를 기준으로 분할 ==\n");
    pos = strtok(str,delimeters);  //처음 호출 시에 대상 문자열 전달
    while (pos != NULL)
    {
        printf ("%s\n",pos);
        pos = strtok (NULL, delimeters);//이 후 NULL 전달
    }   
 
    printf("원본: %s\n",str2);
    //ehstrtok 함수 이용
    printf("== 공백이나 콤마, 느낌표, 마침표를 기준으로 분할 ==\n");
    pos = ehstrtok(str2, delimeters);//처음 호출 시에 대상 문자열 전달
    while (pos != NULL)
    {
        printf("%s\n", pos);
        pos = ehstrtok(NULL, delimeters);//이 후 NULL 전달
    }
    return 0;
}
 
출력
원본:나는 집에 간다. 그리고, C언어로 프로그램을 작성한다. 화이팅! 언제나 휴일
== 공백이나 콤마, 느낌표, 마침표를 기준으로 분할 ==
나는
집에
간다
그리고
C언어로
프로그램을
작성한다
화이팅
언제나
휴일
원본: 다시 한 번 테스트! 이번에는 ehstrtok 함수 사용.
== 공백이나 콤마, 느낌표, 마침표를 기준으로 분할 ==
다시


테스트
이번에는
ehstrtok
함수
사용


반응형