본문 바로가기

C 언어 함수

strtok를 연속 호출하면 인자에 NULL을 넣는다.

strtok 함수는 문자열을 특정 구분자(이 경우 공백 " ")로 분리하는 데 사용되며, 토큰화 작업을 수행하고 저장까지 한다.. strtok을 처음 호출할 때는 대상 문자열을 직접 지정해 주어야 하지만, 이후 같은 문자열에서 계속해서 토큰을 추출할 때는 문자열 파라미터 자리에 NULL을 지정한다. 이것이 가능한 이유는 strtok 함수가 내부적으로 현재 위치를 기억하기 때문이다.

strtok의 동작 방식


초기 호출: strtok은 첫 호출 시에 두 개의 인자를 받는다. 첫 번째 인자는 분리할 원본 문자열이고, 두 번째 인자는 구분자이다.. 함수는 문자열의 시작부터 구분자를 찾고, 구분자 위치에 널 문자('\0')를 끼워 넣어 문자열을 분리한다. 첫 번째 토큰 이후의 문자열의 나머지 부분을 내부적으로 저장한다.


연속 호출: strtok 함수를 이어서 호출할 때는 첫 번째 인자로 NULL을 넘긴다. 이렇게 NULL을 넘기면, strtok는 이전에 처리했던 문자열의 나머지 부분에서 계속해서 토큰을 찾는다. 함수는 내부적으로 문자열의 어디까지 처리했는지 기억하고 있으며, 이 정보를 사용하여 다음 구분자까지 문자열을 탐색하고 다시 널 문자로 분리한다.
종료: 더 이상 토큰을 찾을 수 없을 때, 즉 문자열의 끝에 도달했을 때 strtok은 NULL을 반환하여 토큰 분리가 끝났음을 알린다.

 

예제 코드

char str[] = "This is a sample string";
char *token;

// 첫 번째 토큰 추출
token = strtok(str, " ");
while (token != NULL) {
    printf("%s\n", token);
    // 다음 토큰 추출을 위해 NULL 사용
    token = strtok(NULL, " ");
}

 

위 코드에서 첫 번째 strtok 호출은 "This"를 반환하고, 그 다음 호출들은 "is", "a", "sample", "string"을 차례로 반환합니다. 각 호출마다 NULL을 인자로 사용하는 것은, 이전 호출에서 처리한 문자열의 위치를 기반으로 계속해서 분리 작업을 진행하기 위함이다.

따라서, token = strtok(NULL, " ") 구문은 strtok에 이전에 분리된 위치를 기반으로 다음 토큰을 찾도록 지시하는 것으로, NULL은 이전에 처리한 문자열의 정보를 strtok이 기억하고 있다는 것을 의미한다.

'C 언어 함수' 카테고리의 다른 글

memmove 함수  (0) 2024.05.06
isdigit 함수로 정수인지 찾아내기  (1) 2024.04.28
strcpy와 strdup 차이  (1) 2024.04.28
동적 할당 시 값 초기화 memset 함수  (1) 2024.04.27
sqrt 함수  (1) 2024.04.22