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;
}
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;
}
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, " "); //널문자를 기준으로 다시 자르기
}
}
'Language > C , C++ , C#' 카테고리의 다른 글
[C언어/C++] 문자열 비교 strcmp, strncmp 함수 사용법 & 예제 + 구현 (0) | 2020.08.31 |
---|---|
[C언어,C++] 문자열 합치기 strcat, strncat 함수 사용법 & 예제 +구현 (0) | 2020.08.30 |
[C언어/C++] 문자열 복사하기 strcpy, strncpy 함수 사용법 & 예제 + 구현 (0) | 2020.08.28 |
[C언어/C++] 문자열 길이 구하기 strlen 함수 사용법 & 예제 + 구현 (0) | 2020.08.27 |