[C] strtok
2025. 1. 8. 17:15ㆍ게임개발/C++
1. 설명: 매개변수의 구분자를 기준으로 토큰화해주는 함수이다.
2. 프로토 타입
#include <string.h>
char *strtok(char *str, const char *delim);
3. 예시
//GPT 구현 예시
#include <stdio.h>
#include <stdbool.h>
// strtok와 동일한 인터페이스로 구현
char *my_strtok(char *str, const char *delim) {
static char *next = NULL; // static 변수로 상태를 유지
if (str != NULL) {
next = str; // 새로운 문자열이 전달되면 초기화
} else if (next == NULL) {
return NULL; // 분리할 문자열이 없으면 NULL 반환
}
// 토큰의 시작 위치
char *start = next;
// 문자열의 끝까지 탐색
while (*next != '\0') {
// 현재 문자가 구분자 중 하나인지 확인
const char *d = delim;
while (*d != '\0') {
if (*next == *d) {
*next = '\0'; // 구분자를 '\0'으로 변경해 문자열 분리
next++; // 다음 위치로 이동
// 토큰이 비어있지 않으면 반환
if (start != next - 1) {
return start;
}
// 토큰이 비어있으면 다음 토큰 탐색
start = next;
break;
}
d++;
}
next++;
}
// 마지막 토큰 처리
if (*start != '\0') {
next = NULL; // 더 이상 남은 문자열 없음
return start;
}
return NULL; // 더 이상 토큰이 없음
}
int main() {
char str[] = "C언어;Python,Java|JavaScript"; // 분리할 문자열
char *delim = ";,|"; // 구분자
char *token;
printf("원본 문자열: %s\n", str);
// my_strtok를 호출하여 토큰 분리
token = my_strtok(str, delim);
while (token != NULL) {
printf("토큰: %s\n", token);
token = my_strtok(NULL, delim);
}
return 0;
}
4. 특이점: 처음 위 함수를 보고 함수 내부에서 동적할당을 하는 함수라고 생각했었는데 전혀 아니었다.
매개변수로 받은 문자열을 static pointer로 저장해두는 것이고, 원본 문자열의 토큰부분에 '\0'을 삽입하여 주는것이다.
그래서 사실 출력으로만 보면 완전히 구분해 주는것 같지만 사실은 구분자(delimeter)부분에 '\0'을 삽입해주고 시작 부분의 포인터를 리턴해주는 것이다. 원본 문자열은 구분자의 시작부분이 '\0' 문자로 대체된다.
'게임개발 > C++' 카테고리의 다른 글
| [C] strcpy vs memcpy (0) | 2025.01.06 |
|---|---|
| [Boost] Boost라이브러리 VisualC++ 적용방법 (2) | 2024.11.10 |
| [C++][알고리즘] A*알고리즘 (0) | 2024.05.31 |