또한 소스 문자열의 여러 연속 구분 기호는 하나로 처리됩니다. 예제에서는 두 번째 쉼표가 무시됩니다. 표준 C 라이브러리에는 스레드 안전 또는 재진입 버전이 포함되지 않지만 POSIX의 strtok_r. MSVC에서 strtok_s와 같은 strtok_s는 스레드가 안전하다는 점에 유의하십시오. 9월이 빈 문자열인 경우 strtok() 및 strtok_r()은 토큰화되는 문자열의 나머지 부분에 대한 포인터를 반환합니다. 다른 saveptr 인수를 지정 하는 strtok_r() 호출 시퀀스를 사용 하 여 다른 문자열을 동시에 구문 분석 될 수 있습니다. strtok_r() 함수는 스레드로부터 관련없는 호출로 덮어쓸 수 있는 정적 데이터 영역을 사용하는 대신 스레드로부터 사용할 수 있으며 해당 상태를 사용자가 제공한 버퍼에 저장합니다. strtok_r() 함수는 strtok_r()이 스레드안전해야 하고 인수 상태가 strtok_r() 동일한 문자열을 스캔하는 호출 간에 상태를 유지할 수 있도록 하는 사용자 제공 포인터를 가리킨다는 점을 제외하면 strtok()와 동일합니다. 응용 프로그램은 strtok_r() 호출에 의해 동시에 처리되는 각 문자열에 대해 state를 가리키는 포인터가 고유하도록 해야 합니다. 응용 프로그램은 특정 값에 의해 가리키는 포인터를 초기화 할 필요가 없습니다. 구현은 호출자가 해제하거나 해제해야 하는 문자열 s 내 이외의 리소스를 가리키도록 상태별 포인터를 직접 또는 간접적으로 업데이트하지 않아야 합니다. strtok() 함수는 더 큰 문자열 내에서 구분 기호 문자열을 검색합니다.

구분 기호 문자열 간의 마지막 하위 문자열에 대한 포인터를 반환합니다. 이 함수는 정적 저장소를 사용하여 호출 사이의 현재 문자열 위치를 추적합니다. 새 함수 strtok_r(는 문자열의 현재 위치를 추적하기 위해 추가 인수 인 상태)를 사용합니다. char *strtok_r (char *s1, const char *s2, char **s3); strtok_r() 함수는 재진입 버전 strtok()입니다. saveptr 인수는 동일한 문자열을 구문 분석하는 연속 호출 간의 컨텍스트를 유지하기 위해 strtok_r()에서 내부적으로 사용되는 char * 변수에 대한 포인터입니다. strtok_s를 예제와 함께 사용하면 다음과 같이 올바른 응답이 생성됩니다 . 버퍼로 가리키는 문자 배열의 배열입니다. C는 문자열을 일부 구분 기호로 분할하기 위한 strtok() 및 strtok_r() 두 함수를 제공합니다. 문자열을 분할하는 것은 매우 일반적인 작업입니다.

예를 들어 파일에서 항목의 쉼표로 구분된 목록이 있으며 배열의 개별 항목을 원합니다. strtokis가 재진입하지 않음으로 인해 발생하는 문제를 보여 주는 예제는 다음과 같습니다. 이것이 당신에게 중요한 경우 strtok_r()를 사용합니다. [CX] strtok_r() 함수는 토큰이 발견되지 않은 경우 포인터또는 null 포인터에 대한 포인터를 반환해야 합니다. strtok_r()에서 s1을 통해 진행률을 기록하는 데 사용되는 값 반환 매개 변수입니다. 문자 버퍼 s1이 동적 메모리에 있는 경우 strtok_r()은 스레드에서 사용할 수 있습니다. strtok는 토큰에 새 메모리를 할당하지 않으므로 소스 문자열을 수정합니다. 즉, 위의 예에서는 문자열 src가 조작되어 strtok 호출에 의해 반환되는 포인터에서 참조되는 토큰을 생성합니다.

즉, 소스 문자열은 const일 수 없으므로 문자열 리터럴이 될 수 없습니다. 또한 구분 바이트의 ID가 손실됨을 의미합니다(예에서는 “”와 “!”가 소스 문자열에서 효과적으로 삭제되며 일치하는 구분 기호 문자를 알 수 없습니다). strtok_r() C의 strtok() 함수와 마찬가지로 strtok_r(strtok_r()은 문자열을 토큰 시퀀스로 구문 분석하는 것과 동일한 작업을 수행합니다.