C의 strtok() 및 strtok_r() 함수(예제 포함)
C에서는 문자열을 구분 기호로 분할하는 두 가지 함수 strtok() 및 strtok_r()을 제공합니다. 문자열을 분할하는 것은 매우 일반적인 작업입니다. 예를 들어, 파일에서 쉼표로 구분된 항목 목록이 있고 배열에 개별 항목이 필요하다고 가정합니다.
strtok() 함수
strtok() 메서드는 주어진 구분 기호에 따라 str[]을 분할하고 다음 토큰을 반환합니다. 모든 토큰을 얻으려면 루프에서 호출해야 합니다. 더 이상 토큰이 없으면 NULL을 반환합니다.
strtok() 구문
char * strtok (char * str , const char * delims );
매개변수
- str : 토큰화할 문자열에 대한 포인터입니다. delims : 모든 구분 기호를 포함하는 문자열입니다.
반환 값
- 문자열에서 발견된 첫 번째 토큰에 대한 포인터를 반환합니다.
- 더 이상 토큰을 찾을 수 없으면 NULL을 반환합니다.
strtok()의 예
예시 1: C strtok()를 사용하여 문자열을 분할하는 방법을 보여주는 프로그램입니다.
씨
// C program for splitting a string> // using strtok()> #include> #include> int> main()> {> > char> str[] => 'Geeks-for-Geeks'> ;> > // Returns first token> > char> * token => strtok> (str,> ' - '> );> > // Keep printing tokens while one of the> > // delimiters present in str[].> > while> (token != NULL) {> > printf> (> ' % s
'> , token);> > token => strtok> (NULL,> ' - '> );> > }> > return> 0;> }> |
산출
Geeks for Geeks
예시 2: 구분 기호를 기반으로 문자열을 토큰화하기 위해 strtok() 함수를 사용하는 방법을 보여주는 프로그램입니다.
씨
// C code to demonstrate working of> // strtok> #include> #include> // Driver function> int> main()> {> > // Declaration of string> > char> gfg[100] => ' Geeks - for - geeks - Contribute'> ;> > // Declaration of delimiter> > const> char> s[4] => '-'> ;> > char> * tok;> > // Use of strtok> > // get first token> > tok => strtok> (gfg, s);> > // Checks for delimiter> > while> (tok != 0) {> > printf> (> ' %s
'> , tok);> > // Use of strtok> > // go through other tokens> > tok => strtok> (0, s);> > }> > return> (0);> }> |
산출
Geeks for geeks Contribute
실제 적용 strtok()
strtok()을 사용하면 일부 구분 기호를 기준으로 문자열을 여러 문자열로 분할할 수 있습니다. ㅏ 간단한 CSV 파일 이 기능을 사용하여 지원을 구현할 수 있습니다. CSV 파일에는 구분 기호로 쉼표가 있습니다.
예시 3: C C에서 strtok() 함수를 사용하여 다음을 구현하는 방법을 보여주는 프로그램 간단한 CSV 파일.
씨
// C code to demonstrate practical application of> // strtok> #include> #include> // Driver function> int> main()> {> > // Declaration of string> > // Information to be converted into CSV file> > char> gfg[100] => ' 1997 Ford E350 ac 3000.00'> ;> > // Declaration of delimiter> > const> char> s[4] => ' '> ;> > char> * tok;> > // Use of strtok> > // get first token> > tok => strtok> (gfg, s);> > // Checks for delimiter> > while> (tok != 0) {> > printf> (> '%s, '> , tok);> > // Use of strtok> > // go through other tokens> > tok => strtok> (0, s);> > }> > return> (0);> }> |
산출
1997, Ford, E350, ac, 3000.00,
strtok_r() 함수
C의 strtok() 함수와 마찬가지로 strtok_r()은 문자열을 일련의 토큰으로 구문 분석하는 동일한 작업을 수행합니다. strtok_r()은 strtok()의 재진입 버전이므로 스레드로부터 안전합니다.
strtok_r() 구문
char * strtok_r (char * str , const char * delim , char ** saveptr );
매개변수
- str : 토큰화할 문자열에 대한 포인터입니다. delims : 모든 구분 기호를 포함하는 문자열입니다. saveptr : 동일한 문자열을 구문 분석하는 연속 호출 간의 컨텍스트를 유지하기 위해 strtok_r()에서 내부적으로 사용하는 char * 변수에 대한 포인터입니다.
반환 값
- 문자열에서 발견된 첫 번째 토큰에 대한 포인터를 반환합니다.
- 더 이상 토큰을 찾을 수 없으면 NULL을 반환합니다.
strtok_r()의 예
예시 1: strtok_r()의 사용을 보여주는 간단한 C 프로그램입니다.
씨
// C program to demonstrate working of strtok_r()> // by splitting string based on space character.> #include> #include> int> main()> {> > char> str[] => 'Geeks for Geeks'> ;> > char> * token;> > char> * rest = str;> > while> ((token = strtok_r(rest,> ' '> , &rest)))> > printf> (> '%s
'> , token);> > return> (0);> }> |
산출
Geeks for Geeks
C의 중첩 토큰화
예시 2: 아래 C 프로그램은 중첩 토큰화에 strtok_r() 함수를 사용하는 방법을 보여줍니다.
씨
#include> #include> int> main()> {> > char> str[] => 'Hello, World! Geeks for Geeks.'> ;> > const> char> outer_delimiters[] => '!.'> ;> > const> char> inner_delimiters[] => ' ,'> ;> > char> * token;> > char> * outer_saveptr = NULL;> > char> * inner_saveptr = NULL;> > token = strtok_r(str, outer_delimiters, &outer_saveptr);> > while> (token != NULL) {> > printf> (> 'Outer Token: %s
'> , token);> > char> * inner_token = strtok_r(> > token, inner_delimiters, &inner_saveptr);> > while> (inner_token != NULL) {> > printf> (> 'Inner Token: %s
'> , inner_token);> > inner_token = strtok_r(NULL, inner_delimiters,> > &inner_saveptr);> > }> > token = strtok_r(NULL, outer_delimiters,> > &outer_saveptr);> > }> > return> 0;> }> |
산출
Outer Token: Hello, World Inner Token: Hello Inner Token: World Outer Token: Geeks for Geeks Inner Token: Geeks Inner Token: for Inner Token: Geeks
strtok()와 strtok_r()의 차이점
아래와 같이 strtok()와 strtok_r() 함수의 차이점을 표 형식으로 살펴보겠습니다.
| 예 아니오. | strtok() | strtok_r() |
|---|---|---|
| 1. | 문자열 str을 일련의 토큰으로 나누는 데 사용됩니다. | 문자열을 토큰 패턴으로 디코딩하는 데 사용됩니다. |
| 2. | 구문은 다음과 같습니다. char *strtok(char *str, const char *delim) | 구문은 다음과 같습니다. char *strtok_r(char *string, const char *limiter, char **context); |
| 삼. | 계속하려면 구분 기호를 사용합니다. | strtok()의 재진입 변형입니다. |
| 4. | 두 개의 매개변수가 필요합니다. | 세 가지 매개변수를 사용합니다. |
| 5. | 문자열에서 발견된 첫 번째 토큰에 대한 포인터를 반환합니다. | 문자열에서 발견된 첫 번째 토큰에 대한 포인터를 반환합니다. |
| 6. | 스레드로부터 안전하지 않습니다. | 스레드로부터 안전합니다. |