funkcie strtok() a strtok_r() v C s príkladmi

C poskytuje dve funkcie strtok() a strtok_r() na rozdelenie reťazca nejakým oddeľovačom. Rozdelenie reťazca je veľmi bežnou úlohou. Napríklad máme čiarkami oddelený zoznam položiek zo súboru a chceme jednotlivé položky v poli.

Funkcia strtok().

Metóda strtok() rozdelí str[] podľa daných oddeľovačov a vráti ďalší token. Na získanie všetkých tokenov je potrebné ho volať v slučke. Keď už nie sú žiadne tokeny, vráti hodnotu NULL.

Syntax strtok()

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

Parametre

    str : Je to ukazovateľ na reťazec, ktorý sa má tokenizovať. delims : Je to reťazec obsahujúci všetky oddeľovače.

Návratová hodnota

  • Vracia ukazovateľ na prvý token, ktorý sa v reťazci vyskytuje.
  • Ak nie sú nájdené žiadne ďalšie tokeny, vráti hodnotu NULL.

Príklady strtok()

Príklad 1: C Program, ktorý demonštruje, ako rozdeliť reťazec pomocou 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ýkon

 Geeks for Geeks 

Príklad 2: Program demonštruje použitie funkcie strtok() na tokenizáciu reťazca na základe oddeľovača.

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ýkon

 Geeks for geeks Contribute 

Praktická aplikácia strtok()

strtok() možno použiť na rozdelenie reťazca do viacerých reťazcov na základe niektorých oddeľovačov. A jednoduchý súbor CSV pomocou tejto funkcie možno implementovať podporu. Súbory CSV majú ako oddeľovače čiarky.

Príklad 3: C Program na demonštráciu použitia funkcie strtok() v C na implementáciu a jednoduchý súbor 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ýkon

1997, Ford, E350, ac, 3000.00, 

Funkcia strtok_r().

Rovnako ako funkcia strtok() v jazyku C, strtok_r() vykonáva rovnakú úlohu pri analýze reťazca do postupnosti tokenov. strtok_r() je opakovaná verzia strtok(), preto je bezpečná pre vlákna.

Syntax strtok_r()

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

Parametre

    str : Je to ukazovateľ na reťazec, ktorý sa má tokenizovať. delims : Je to reťazec obsahujúci všetky oddeľovače. saveptr : Je to ukazovateľ na premennú char *, ktorú interne používa strtok_r(), aby sa zachoval kontext medzi po sebe nasledujúcimi volaniami, ktoré analyzujú rovnaký reťazec.

Návratová hodnota

  • Vracia ukazovateľ na prvý token, ktorý sa v reťazci vyskytuje.
  • Ak nie sú nájdené žiadne ďalšie tokeny, vráti hodnotu NULL.

Príklady strtok_r()

Príklad 1: jednoduchý program v jazyku C, ktorý ukazuje použitie 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ýkon

Geeks for Geeks 

Vnorená tokenizácia v C

Príklad 2: Nižšie uvedený program C demonštruje použitie funkcie strtok_r() pre vnorenú tokenizáciu.

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ýkon

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

Rozdiel medzi strtok() a strtok_r()

Pozrime sa na rozdiely medzi funkciami strtok() a strtok_r() v tabuľkovej forme, ako je uvedené nižšie:

Áno nie.

strtok()

strtok_r()

1.

Používa sa na rozdelenie reťazca str na sériu tokenov. Používa sa na dekódovanie reťazca do vzoru pre tokeny.

2.

Syntax je nasledovná:

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

Jeho syntax je nasledovná:
char *strtok_r(char *retazec, const char *limiter, char **kontext);

3.

Na pokračovanie používa oddeľovač. Je to znovu zadaný variant strtok().

4.

Vyžaduje si to dva parametre. Chce to tri parametre.

5.

Vracia ukazovateľ na prvý token nájdený v reťazci. Vracia ukazovateľ na prvý token nájdený v reťazci.
6. Nie je bezpečný pre vlákna. Je bezpečný pre vlákna.