std:: strtok
|
헤더 파일에 정의됨
<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 바이트 문자열을 가리키는 포인터가 아닌 경우, 동작은 정의되지 않습니다.
목차 |
매개변수
| 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) |
|
|
(C++20)
|
구분자를 사용하여 다른
view
를 분할하여 얻은
서브레인지에 대한
view
(class template) (range adaptor object) |
|
C documentation
for
strtok
|
|