C udostępnia dwie funkcje strtok() i strtok_r() służące do dzielenia ciągu znaków za pomocą ogranicznika. Dzielenie łańcucha jest bardzo częstym zadaniem. Na przykład mamy listę elementów oddzielonych przecinkami z pliku i chcemy, aby poszczególne elementy znajdowały się w tablicy.
Funkcja strtok().
Metoda strtok() dzieli str[] według podanych ograniczników i zwraca następny token. Aby uzyskać wszystkie tokeny, należy go wywołać w pętli. Zwraca NULL, gdy nie ma już więcej tokenów.
Składnia strtok()
char * strtok (char * str , const char * delims );>
Parametry
- str : Jest to wskaźnik do ciągu znaków, który ma być tokenizowany. delims : Jest to ciąg znaków zawierający wszystkie ograniczniki.
Wartość zwracana
- Zwraca wskaźnik do pierwszego tokenu napotkanego w ciągu.
- Zwraca NULL, jeśli nie znaleziono więcej tokenów.
Przykłady strtok()
Przykład 1: Program w C demonstrujący, jak podzielić ciąg znaków za pomocą strtok().
C
// 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;> }> |
>
>Wyjście
Geeks for Geeks>
Przykład 2: Program demonstrujący użycie funkcji strtok() do tokenizacji ciągu znaków w oparciu o ogranicznik.
C
// 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);> }> |
>
>Wyjście
Geeks for geeks Contribute>
Praktyczne zastosowanie strtok()
Funkcja strtok() może zostać użyta do podzielenia ciągu na wiele ciągów w oparciu o pewne separatory. A prosty plik CSV wsparcie może zostać zaimplementowane przy użyciu tej funkcji. Pliki CSV mają przecinki jako ograniczniki.
Przykład 3: Program w C demonstrujący użycie funkcji strtok() w C do implementacji a prosty plik CSV.
C
// 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);> }> |
>
>Wyjście
1997, Ford, E350, ac, 3000.00,>
Funkcja strtok_r().
Podobnie jak funkcja strtok() w C, strtok_r() wykonuje to samo zadanie polegające na przetwarzaniu ciągu znaków na sekwencję tokenów. strtok_r() jest współbieżną wersją strtok(), dlatego jest bezpieczna dla wątków.
Składnia strtok_r()
char * strtok_r (char * str , const char * delim , char ** saveptr );>
Parametry
- str : Jest to wskaźnik do ciągu znaków, który ma być tokenizowany. delims : Jest to ciąg znaków zawierający wszystkie ograniczniki. saveptr : Jest to wskaźnik do zmiennej char * używanej wewnętrznie przez strtok_r() w celu zachowania kontekstu pomiędzy kolejnymi wywołaniami analizującymi ten sam ciąg znaków.
Wartość zwracana
- Zwraca wskaźnik do pierwszego tokenu napotkanego w ciągu.
- Zwraca NULL, jeśli nie znaleziono więcej tokenów.
Przykłady strtok_r()
Przykład 1: prosty program w C pokazujący użycie 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);> }> |
>
>
Wyjście
Geeks for Geeks>
Zagnieżdżona tokenizacja w C
Przykład 2: Poniższy program w C demonstruje użycie funkcji strtok_r() do tokenizacji zagnieżdżonej.
C
#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;> }> |
>
>
Wyjście
Outer Token: Hello, World Inner Token: Hello Inner Token: World Outer Token: Geeks for Geeks Inner Token: Geeks Inner Token: for Inner Token: Geeks>
Różnica między strtok() i strtok_r()
Zobaczmy różnice pomiędzy funkcjami strtok() i strtok_r() w formie tabelarycznej, jak pokazano poniżej:
Tak nie. | strtok() | strtok_r() |
---|---|---|
1. | Służy do dzielenia ciągu znaków na serię tokenów. | Służy do dekodowania ciągu znaków we wzór dla tokenów. |
2. | Składnia jest następująca: char *strtok(char *str, const char *delim) hostowanie Linuksa | Jego składnia jest następująca: char *strtok_r(char *string, const char *limiter, char **kontekst); |
3. | Aby kontynuować, używa ogranicznika. | Jest to ponownie wprowadzony wariant strtok(). |
4. | Przyjmuje dwa parametry. | Wymaga trzech parametrów. |
5. | Zwraca wskaźnik do pierwszego tokenu znalezionego w ciągu. | Zwraca wskaźnik do pierwszego tokenu znalezionego w ciągu. |
6. | Nie jest bezpieczny dla wątków. | Jest bezpieczny dla wątków. |