Namespaces
Variants

std:: strtok

From cppreference.net
헤더 파일에 정의됨 <cstring>
char * strtok ( char * str, const char * delim ) ;

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

std::strtok 에 대한 일련의 호출은 str 이 가리키는 문자열을 delim 이 가리키는 문자열에 포함된 문자로 구분된 토큰들의 시퀀스로 분해합니다. 이 시퀀스의 각 호출은 검색 대상 을 가집니다:

  • 만약 str 이 null이 아니면, 이 호출은 시퀀스에서 첫 번째 호출 입니다. 검색 대상은 str 이 가리키는 null로 종료되는 바이트 문자열입니다.
  • 만약 str 이 null이면, 이 호출은 시퀀스에서 후속 호출 중 하나입니다. 검색 대상은 시퀀스의 이전 호출에 의해 결정됩니다.

시퀀스의 각 호출은 검색 대상에서 delim 이 가리키는 separator string 에 포함 되지 않는 첫 번째 문자를 검색하며, 구분자 문자열은 호출마다 다를 수 있습니다.

  • 해당 문자가 발견되지 않으면, 검색 대상에 토큰이 없는 것입니다. 시퀀스에서 다음 호출의 검색 대상은 변경되지 않습니다. [1]
  • 해당 문자가 발견되면, 이것이 현재 토큰의 시작입니다. std::strtok 는 그 지점부터 구분자 문자열에 포함된 첫 번째 문자를 검색합니다.
    • 해당 문자가 발견되지 않으면, 현재 토큰은 검색 대상의 끝까지 확장됩니다. 시퀀스에서 다음 호출의 검색 대상은 빈 문자열입니다. [2]
    • 해당 문자가 발견되면, 널 문자로 덮어쓰여지며 이것이 현재 토큰의 종료를 의미합니다. 시퀀스에서 다음 호출의 검색 대상은 다음 문자부터 시작됩니다.

만약 str 또는 delim 가 null-terminated 바이트 문자열을 가리키는 포인터가 아닌 경우, 동작은 정의되지 않습니다.

  1. 토큰은 이후 다른 구분자 문자열을 사용한 호출에서도 여전히 형성될 수 있습니다.
  2. 이후 호출에서는 더 이상 토큰을 형성할 수 없습니다.

목차

매개변수

str - 토큰화할 null로 종료되는 바이트 문자열에 대한 포인터
delim - 구분자를 식별하는 null로 종료되는 바이트 문자열에 대한 포인터

반환값

다음 토큰의 첫 번째 문자에 대한 포인터를 반환하며, 토큰이 없을 경우 널 포인터를 반환합니다.

참고 사항

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

이 함수를 호출할 때마다 정적 변수가 수정됩니다: 스레드 안전하지 않습니다.

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

가능한 구현

char* strtok(char* str, const char* delim)
{
    static char* buffer;
    if (str != nullptr)
        buffer = str;
    buffer += std::strspn(buffer, delim);
    if (*buffer == '\0')
        return nullptr;
    char* const tokenBegin = buffer;
    buffer += std::strcspn(buffer, delim);
    if (*buffer != '\0')
        *buffer++ = '\0';
    return tokenBegin;
}

이 함수의 실제 C++ 라이브러리 구현은 C 라이브러리에 위임하며, 여기서는 직접 구현될 수도 있고(예: MUSL libc ), 재진입 가능 버전으로 구현될 수도 있습니다(예: GNU libc ).

예제

#include <cstring>
#include <iomanip>
#include <iostream>
int main() 
{
    char input[] = "one + two * (three - four)!";
    const char* delimiters = "! +- (*)";
    char* token = std::strtok(input, delimiters);
    while (token)
    {
        std::cout << std::quoted(token) << ' ';
        token = std::strtok(nullptr, delimiters);
    }
    std::cout << "\nContents of the input string now:\n\"";
    for (std::size_t n = 0; n < sizeof input; ++n)
    {
        if (const char c = input[n]; c != '\0')
            std::cout << c;
        else
            std::cout << "\\0";
    }
    std::cout << "\"\n";
}

출력:

"one" "two" "three" "four" 
Contents of the input string now:
"one\0+ two\0* (three\0- four\0!\0"

참고 항목

구분자 집합에서 임의의 문자가 처음 나타나는 위치를 찾음
(function)
다른 바이트 문자열에서 찾을 수 없는 문자로만 구성된
최대 초기 세그먼트의 길이를 반환
(function)
다른 바이트 문자열에서 찾을 수 있는 문자로만 구성된
최대 초기 세그먼트의 길이를 반환
(function)
구분자를 사용하여 다른 view 를 분할하여 얻은
서브레인지에 대한 view
(class template) (range adaptor object)