strtok, strtok_s
|
헤더 파일에 정의됨
<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 이후) |
널 종료 바이트 문자열을 토큰화합니다.
strtok
에 대한 일련의 호출은
str
이 가리키는 문자열을
delim
이 가리키는 문자열의 문자로 구분된 토큰들의 시퀀스로 분할합니다. 시퀀스 내 각 호출은
검색 대상
을 가집니다:
- str 이 null이 아닌 경우, 이 호출은 시퀀스의 첫 번째 호출 입니다. 검색 대상은 str 이 가리키는 null로 종료되는 바이트 문자열입니다.
- str 이 null인 경우, 이 호출은 시퀀스의 후속 호출 중 하나입니다. 검색 대상은 시퀀스 내 이전 호출에 의해 결정됩니다.
- 해당 문자가 발견되지 않으면 검색 대상에 토큰이 존재하지 않습니다. 시퀀스의 다음 호출을 위한 검색 대상은 변경되지 않습니다. [1]
-
해당 문자가 발견되면, 이는 현재 토큰의 시작점입니다.
strtok는 여기서부터 구분자 문자열에 포함된 첫 번째 문자를 검색합니다.- 해당 문자가 발견되지 않으면 현재 토큰은 검색 대상의 끝까지 확장됩니다. 시퀀스의 다음 호출을 위한 검색 대상은 빈 문자열입니다. [2]
- 해당 문자가 발견되면 널 문자로 덮어쓰여지며, 이는 현재 토큰을 종료합니다. 시퀀스의 다음 호출을 위한 검색 대상은 다음 문자부터 시작됩니다.
- 각 호출에서 str 에서 확인할 수 있는 남은 문자 수를 * strmax 에 기록하고, 토크나이저의 내부 상태를 * ptr 에 기록합니다.
- 시퀀스의 후속 호출에서는 이전 호출에서 저장된 값으로 strmax 와 ptr 를 전달해야 합니다.
-
다음 오류들은 런타임에 감지되며,
ptr
이 가리키는 객체에 아무것도 저장하지 않고 현재 설치된
constraint handler
함수를 호출합니다:
- strmax , delim , 또는 ptr 가 null 포인터인 경우.
- 시퀀스의 후속 호출에서 * ptr 가 null 포인터인 경우.
- * strmax 가 RSIZE_MAX 보다 큰 경우.
- 발견된 토큰의 끝이 검색 대상의 첫 * s1max 문자 내에서 발생하지 않는 경우.
strtok_s
는 구현체가
__STDC_LIB_EXT1__
를 정의하고, 사용자가
__STDC_WANT_LIB_EXT1__
를 정수 상수
1
으로 정의한 후에만
<string.h>
를 포함할 때 사용 가능함이 보장됩니다.
목차 |
매개변수
| str | - | 토큰화할 null로 종료되는 바이트 문자열에 대한 포인터 |
| delim | - | 구분자를 식별하는 null로 종료되는 바이트 문자열에 대한 포인터 |
| strmax | - |
처음에
str
의 크기를 보유하는 객체에 대한 포인터:
strtok_s
는 검토할 문자의 수를 저장함
|
| ptr | - |
char
*
타입의 객체에 대한 포인터로,
strtok_s
가 내부 상태를 저장하는 데 사용함
|
반환값
참고
이 함수는 파괴적입니다: 문자열
'
\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)
|
와이드 문자열에서 다음 토큰을 찾음
(함수) |
|
C++ documentation
for
strtok
|
|