Namespaces
Variants

strtok, strtok_s

From cppreference.net
< c ‎ | string ‎ | byte
헤더 파일에 정의됨 <string.h>
(1)
char * strtok ( char * str, const char * delim ) ;
(C99 이전)
char * strtok ( char * restrict str, const char * restrict delim ) ;
(C99 이후)
char * strtok_s ( char * restrict str, rsize_t * restrict strmax,
const char * restrict delim, char ** restrict ptr ) ;
(2) (C11 이후)

널 종료 바이트 문자열을 토큰화합니다.

1) strtok 에 대한 일련의 호출은 str 이 가리키는 문자열을 delim 이 가리키는 문자열의 문자로 구분된 토큰들의 시퀀스로 분할합니다. 시퀀스 내 각 호출은 검색 대상 을 가집니다:
  • str 이 null이 아닌 경우, 이 호출은 시퀀스의 첫 번째 호출 입니다. 검색 대상은 str 이 가리키는 null로 종료되는 바이트 문자열입니다.
  • str 이 null인 경우, 이 호출은 시퀀스의 후속 호출 중 하나입니다. 검색 대상은 시퀀스 내 이전 호출에 의해 결정됩니다.
시퀀스의 각 호출은 검색 대상에서 delim 이 가리키는 separator string 에 포함되지 않는 첫 번째 문자를 검색하며, 구분자 문자열은 호출마다 다를 수 있습니다.
  • 해당 문자가 발견되지 않으면 검색 대상에 토큰이 존재하지 않습니다. 시퀀스의 다음 호출을 위한 검색 대상은 변경되지 않습니다. [1]
  • 해당 문자가 발견되면, 이는 현재 토큰의 시작점입니다. strtok 는 여기서부터 구분자 문자열에 포함된 첫 번째 문자를 검색합니다.
    • 해당 문자가 발견되지 않으면 현재 토큰은 검색 대상의 끝까지 확장됩니다. 시퀀스의 다음 호출을 위한 검색 대상은 빈 문자열입니다. [2]
    • 해당 문자가 발견되면 널 문자로 덮어쓰여지며, 이는 현재 토큰을 종료합니다. 시퀀스의 다음 호출을 위한 검색 대상은 다음 문자부터 시작됩니다.
만약 str 또는 delim 이 null로 종료된 바이트 문자열을 가리키는 포인터가 아닌 경우, 동작은 정의되지 않습니다.
2) 다음 차이점을 제외하고는 (1) 과 동일합니다:
  • 각 호출에서 str 에서 확인할 수 있는 남은 문자 수를 * strmax 에 기록하고, 토크나이저의 내부 상태를 * ptr 에 기록합니다.
  • 시퀀스의 후속 호출에서는 이전 호출에서 저장된 값으로 strmax ptr 를 전달해야 합니다.
  • 다음 오류들은 런타임에 감지되며, ptr 이 가리키는 객체에 아무것도 저장하지 않고 현재 설치된 constraint handler 함수를 호출합니다:
    • strmax , delim , 또는 ptr 가 null 포인터인 경우.
    • 시퀀스의 후속 호출에서 * ptr 가 null 포인터인 경우.
    • * strmax RSIZE_MAX 보다 큰 경우.
    • 발견된 토큰의 끝이 검색 대상의 첫 * s1max 문자 내에서 발생하지 않는 경우.
만약 str 가 널 문자를 포함하지 않는 문자 배열을 가리키고, strmax 가 해당 문자 배열의 크기보다 큰 값을 가리키는 경우, 동작은 정의되지 않습니다.
모든 경계 검사 함수와 마찬가지로, strtok_s 는 구현체가 __STDC_LIB_EXT1__ 를 정의하고, 사용자가 __STDC_WANT_LIB_EXT1__ 를 정수 상수 1 으로 정의한 후에만 <string.h> 를 포함할 때 사용 가능함이 보장됩니다.
  1. 토큰은 이후 다른 구분자 문자열을 사용한 호출에서도 여전히 형성될 수 있습니다.
  2. 이후 호출에서는 더 이상 토큰을 형성할 수 없습니다.

목차

매개변수

str - 토큰화할 null로 종료되는 바이트 문자열에 대한 포인터
delim - 구분자를 식별하는 null로 종료되는 바이트 문자열에 대한 포인터
strmax - 처음에 str 의 크기를 보유하는 객체에 대한 포인터: strtok_s 는 검토할 문자의 수를 저장함
ptr - char * 타입의 객체에 대한 포인터로, strtok_s 가 내부 상태를 저장하는 데 사용함

반환값

1) 다음 토큰의 첫 번째 문자에 대한 포인터를 반환하며, 토큰이 없을 경우 널 포인터를 반환합니다.
2) 다음 토큰의 첫 번째 문자에 대한 포인터를 반환하며, 토큰이 없거나 런타임 제약 조건 위반이 있는 경우 null 포인터를 반환합니다.

참고

이 함수는 파괴적입니다: 문자열 ' \0 ' 문자들을 str 의 요소들에 기록합니다. 특히, 문자열 리터럴은 strtok 의 첫 번째 인자로 사용될 수 없습니다.

각각의 strtok 호출은 정적 변수를 수정합니다: 스레드 안전하지 않습니다.

대부분의 다른 토크나이저와 달리, strtok 에서는 각 후속 토큰에 대한 구분자가 다를 수 있으며, 이전 토큰의 내용에 따라 달라질 수도 있습니다.

strtok_s 함수는 POSIX strtok_r 함수와 달리 토큰화되는 문자열 외부에 저장되는 것을 방지하고 런타임 제약 조건을 검사합니다. Microsoft CRT strtok_s 시그니처는 C11 strtok_s 가 아닌 이 POSIX strtok_r 정의와 일치합니다.

예제

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>
int main(void)
{
    char input[] = "A bird came down the walk";
    printf("Parsing the input string '%s'\n", input);
    char* token = strtok(input, " ");
    while (token)
    {
        puts(token);
        token = strtok(NULL, " ");
    }
    printf("Contents of the input string now: '");
    for (size_t n = 0; n < sizeof input; ++n)
        input[n] ? putchar(input[n]) : fputs("\\0", stdout);
    puts("'");
#ifdef __STDC_LIB_EXT1__
    char str[] = "A bird came down the walk";
    rsize_t strmax = sizeof str;
    const char* delim = " ";
    char* next_token;
    printf("Parsing the input string '%s'\n", str);
    token = strtok_s(str, &strmax, delim, &next_token);
    while (token)
    {
        puts(token);
        token = strtok_s(NULL, &strmax, delim, &next_token);
    }
    printf("Contents of the input string now: '");
    for (size_t n = 0; n < sizeof str; ++n)
        str[n] ? putchar(str[n]) : fputs("\\0", stdout);
    puts("'");
#endif
}

가능한 출력:

Parsing the input string 'A bird came down the walk'
A
bird
came
down
the
walk
Contents of the input string now: 'A\0bird\0came\0down\0the\0walk\0'
Parsing the input string 'A bird came down the walk'
A
bird
came
down
the
walk
Contents of the input string now: 'A\0bird\0came\0down\0the\0walk\0'

참조문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.24.5.8 strtok 함수 (p: TBD)
  • K.3.7.3.1 strtok_s 함수 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.24.5.8 strtok 함수 (p: TBD)
  • K.3.7.3.1 strtok_s 함수 (p: TBD)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.24.5.8 strtok 함수 (p: 369-370)
  • K.3.7.3.1 strtok_s 함수 (p: 620-621)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.21.5.8 strtok 함수 (p: 332-333)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.11.5.8 strtok 함수

참고 항목

한 문자열에서 다른 문자열에 포함된 어떤 문자의 첫 위치를 찾음
(함수)
다른 바이트 문자열에서 찾을 수 없는 문자들로만 구성된
최대 초기 세그먼트의 길이를 반환
(함수)
다른 바이트 문자열에서 찾을 수 있는 문자들로만 구성된
최대 초기 세그먼트의 길이를 반환
(함수)
(C95) (C11)
와이드 문자열에서 다음 토큰을 찾음
(함수)