[C언어/C++] 문자열 자르기 (strtok, strtok_s) 함수 사용법 & 예제 +구현

C언어 혹은 C++에서 자신이 원하는 문자열을 잘라낼 때 사용하는 함수로 strtok라는 함수가 있습니다. 이 함수는 string token의 약자로 인자 값으로 전달받은 매개변수를 구분자로 하여 문자열을 잘라내어 return 합니다. 만약 더 이상 자를 문자열이 없다면 NULL을 반환합니다.

 

문자열을 자르는 방식

M Y   N A M E   I S   T O M \0
M Y \0 N A M E   I S   T O M \0
M Y \0 N A M E \0 I S   T O M \0
M Y \0 N A M E \0 I S \0 T O M \0

C언어 또는 C++에서 문자열은 \0으로 종료가 되게 되어있습니다. 그렇기에 인자로 받은 문자열에서 구분자가 있는 위치를 널 포인트로 치환해줌으로써, 문자열을 끊기게 만듭니다. 예를 들어 공백을 구분자로 뒀을 경우 위와 같은 방식으로 문자열이 잘리게 됩니다.

 

strtok 함수 형식

char *strtok(char *_String, const char *_Delimit);
char *strtok_s(char *_String, const char *_Delimit, char **_Context);

String : 자르고자 하는 문자열

Delimit : 자를 기준을 정하는 구분자

Context : 분할 한 문자열

 

strtok 함수 사용 예제

#include <stdio.h>
#include <string.h> //strtok 함수가 선언된 헤더 파일
//#include <cstring> //C++일 경우

int main() {
    char str[] = "MY NAME IS TOM"; //대상 문자열 
    char *temp = strtok(str," "); //공백을 기준으로 문자열 자르기
    
    while (temp != NULL) { //널이 아닐때까지 반복
        printf("%s\n",temp); // 출력
        temp = strtok(NULL, " ");	//널문자를 기준으로 다시 자르기
    }
	
    return 0;
}

Stock 함수

strtok 함수는 잘린 문자열을 한 번에 얻을 수 없어서 while 반복문으로 문자열을 계속 자르다가 문자열이 나오지 않으면 반복문을 끝내는 방식으로 사용합니다. strtok 함수는 더 이상 자를 수가 없으면 NULL값을 리턴하므로 NULL값이 리턴될 때까지 반복하여 문자열을 자르는 방식입니다.

 

strtok_s 함수 사용 예제

#include <stdio.h>
#include <string.h> //strtok 함수가 선언된 헤더 파일
//#include <cstring> //C++일 경우

int main() {
    char str[] = "MY NAME IS TOM"; //대상 문자열 
    char* str2 = NULL;
    char* temp = strtok_s(str, " ", &str2); //공백을 기준으로 문자열 자르기

    while (temp != NULL) { //널이 아닐때까지 반복
        printf("잘린 문자열 : %s\n", temp); // 출력
        printf("자르고 남은 문자열 : %s\n", str2);
        temp = strtok_s(NULL, " ", &str2);	//널문자를 기준으로 다시 자르기
    }

    return 0;
}

Stock 함수 예제

strtok_s 함수는 strtok 함수를 개선한 함수입니다. 인자값으로 자르고 남은 문자열을 저장하는 위치 context의 주소를 받는다는것을 제외하면 strtok함수와 같습니다. strtok함수를 더욱 안전하게 사용하려면 strtok_s 함수를 사용해보세요.

 

strtok 함수 구현

#include <stdio.h>

char* my_strtok(char* str, const char* delimiters ){
   static char* pCurrent;
   char* pDelimit;

   if ( str != NULL )pCurrent = str;
   else str = pCurrent;

   if(*pCurrent == NULL) return NULL;

   //문자열 점검
   while (*pCurrent)
   {
       pDelimit = (char*)delimiters ;
       
       while (*pDelimit){
         if(*pCurrent == *pDelimit){
               *pCurrent = NULL;
               ++pCurrent;
               return str;
            }
            ++pDelimit;
       }
       ++pCurrent;
   }
    // 더이상 자를 수 없다면 NULL반환
    return str;
}

int main(){
  char str[] = "MY NAME IS TOM"; //대상 문자열 
  char *temp = my_strtok(str," "); //공백을 기준으로 문자열 자르기
  
  while (temp != NULL) { //널이 아닐때까지 반복
      printf("%s\n",temp); // 출력
      temp = my_strtok(NULL, " ");	//널문자를 기준으로 다시 자르기
  }
}

Stock 함수 구현

댓글

Designed by JB FACTORY