logo

Funkcje strtok() i strtok_r() w C z przykładami

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.