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) java reťazec do poľa | 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. |