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) df loc | 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. |