Funkce strtok() a strtok_r() v C s příklady

C poskytuje dvě funkce strtok() a strtok_r() pro rozdělení řetězce nějakým oddělovačem. Rozdělení řetězce je velmi častým úkolem. Máme například čárkami oddělený seznam položek ze souboru a chceme jednotlivé položky v poli.

Funkce strtok().

Metoda strtok() rozdělí str[] podle daných oddělovačů a vrátí další token. Pro získání všech tokenů je třeba jej volat ve smyčce. Vrátí NULL, když už nejsou žádné tokeny.

Syntaxe strtok()

char * strtok (char * str , const char * delims ); 

Parametry

    str : Je to ukazatel na řetězec, který má být tokenizován. delims : Je to řetězec obsahující všechny oddělovače.

Návratová hodnota

  • Vrátí ukazatel na první token nalezený v řetězci.
  • Pokud nejsou nalezeny žádné další tokeny, vrátí hodnotu NULL.

Příklady strtok()

Příklad 1: C Program demonstrující, jak rozdělit řetězec 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;> }>

Výstup

 Geeks for Geeks 

Příklad 2: Program to demonstruje použití funkce strtok() k tokenizaci řetězce na základě oddělovače.

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);> }>

Výstup

 Geeks for geeks Contribute 

Praktická aplikace strtok()

strtok() lze použít k rozdělení řetězce na více řetězců na základě některých oddělovačů. A jednoduchý soubor CSV pomocí této funkce lze implementovat podporu. Soubory CSV mají jako oddělovače čárky.

Příklad 3: C Program k demonstraci použití funkce strtok() v C k implementaci a jednoduchý soubor 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);> }>

Výstup

1997, Ford, E350, ac, 3000.00, 

Funkce strtok_r().

Stejně jako funkce strtok() v C, strtok_r() provádí stejný úkol analýzy řetězce do sekvence tokenů. strtok_r() je reentrantní verze strtok(), a proto je bezpečná pro vlákna.

Syntaxe strtok_r()

char * strtok_r (char * str , const char * delim , char ** saveptr ); 

Parametry

    str : Je to ukazatel na řetězec, který má být tokenizován. delims : Je to řetězec obsahující všechny oddělovače. saveptr : Je to ukazatel na proměnnou char *, kterou interně používá strtok_r() za účelem udržení kontextu mezi po sobě jdoucími voláními, která analyzují stejný řetězec.

Návratová hodnota

  • Vrátí ukazatel na první token nalezený v řetězci.
  • Pokud nejsou nalezeny žádné další tokeny, vrátí hodnotu NULL.

Příklady strtok_r()

Příklad 1: jednoduchý program v C, který ukazuje použití 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);> }>

Výstup

Geeks for Geeks 

Vnořená tokenizace v C

Příklad 2: Níže uvedený program C demonstruje použití funkce strtok_r() pro vnořenou tokenizaci.

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;> }>

Výstup

Outer Token: Hello, World Inner Token: Hello Inner Token: World Outer Token: Geeks for Geeks Inner Token: Geeks Inner Token: for Inner Token: Geeks 

Rozdíl mezi strtok() a strtok_r()

Podívejme se na rozdíly mezi funkcemi strtok() a strtok_r() v tabulkové podobě, jak je uvedeno níže:

Ano ne.

strtok()

strtok_r()

1.

Používá se k rozdělení řetězce str na řadu tokenů. Používá se k dekódování řetězce do vzoru pro tokeny.

2.

Syntaxe je následující:

char *strtok(char *str, const char *delim)

Jeho syntaxe je následující:
char *strtok_r(char *string, const char *limiter, char **kontext);

3.

K pokračování používá oddělovač. Je to znovu zadaná varianta strtok().

4.

Chce to dva parametry. Chce to tři parametry.

5.

Vrací ukazatel na první nalezený token v řetězci. Vrací ukazatel na první nalezený token v řetězci.
6. Není bezpečný pro vlákna. Je bezpečný pro vlákna.