funkciji strtok() in strtok_r() v C s primeri
C ponuja dve funkciji strtok() in strtok_r() za razdelitev niza z nekaterim ločilom. Razdelitev niza je zelo pogosta naloga. Na primer, imamo z vejicami ločen seznam elementov iz datoteke in želimo posamezne elemente v matriki.
Funkcija strtok().
Metoda strtok() razdeli str[] glede na dane ločila in vrne naslednji žeton. Za pridobitev vseh žetonov ga je treba poklicati v zanki. Ko ni več žetonov, vrne NULL.
Sintaksa strtok()
char * strtok (char * str , const char * delims );
Parametri
- str : je kazalec na niz, ki ga je treba označiti z žetoni. ločila : je niz, ki vsebuje vse ločila.
Povratna vrednost
- Vrne kazalec na prvi žeton, ki ga najde v nizu.
- Če ni več najdenih žetonov, vrne NULL.
Primeri strtok()
Primer 1: Program C za prikaz, kako razdeliti niz z uporabo 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;> }> |
Izhod
Geeks for Geeks
Primer 2: Program za prikaz uporabe funkcije strtok() za tokeniziranje niza na podlagi ločila.
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);> }> |
Izhod
Geeks for geeks Contribute
Praktična uporaba strtok()
strtok() lahko uporabite za razdelitev niza na več nizov na podlagi nekaterih ločil. A preprosto datoteko CSV podpora se lahko izvaja s to funkcijo. Datoteke CSV imajo vejice kot ločila.
Primer 3: Program C za prikaz uporabe funkcije strtok() v C za implementacijo a preprosto datoteko 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);> }> |
Izhod
1997, Ford, E350, ac, 3000.00,
Funkcija strtok_r().
Tako kot funkcija strtok() v C, strtok_r() opravi isto nalogo razčlenjevanja niza v zaporedje žetonov. strtok_r() je vnovična različica strtok(), zato je varna za niti.
Sintaksa strtok_r()
char * strtok_r (char * str , const char * delim , char ** saveptr );
Parametri
- str : je kazalec na niz, ki ga je treba označiti z žetoni. ločila : je niz, ki vsebuje vse ločila. saveptr : je kazalec na spremenljivko char *, ki jo interno uporablja strtok_r(), da ohrani kontekst med zaporednimi klici, ki razčlenijo isti niz.
Povratna vrednost
- Vrne kazalec na prvi žeton, ki ga najde v nizu.
- Če ni več najdenih žetonov, vrne NULL.
Primeri strtok_r()
Primer 1: preprost program C za prikaz uporabe 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);> }> |
Izhod
Geeks for Geeks
Ugnezdena tokenizacija v C
Primer 2: Spodnji program C prikazuje uporabo funkcije strtok_r() za ugnezdeno tokenizacijo.
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;> }> |
Izhod
Outer Token: Hello, World Inner Token: Hello Inner Token: World Outer Token: Geeks for Geeks Inner Token: Geeks Inner Token: for Inner Token: Geeks
Razlika med strtok() in strtok_r()
Oglejmo si razlike med funkcijama strtok() in strtok_r() v obliki tabele, kot je prikazano spodaj:
| da ne | strtok() | strtok_r() |
|---|---|---|
| 1. | Uporablja se za razdelitev niza str v vrsto žetonov. | Uporablja se za dekodiranje niza v vzorec za žetone. |
| 2. | Sintaksa je naslednja: char *strtok(char *str, const char *delim) | Njegova sintaksa je naslednja: char *strtok_r(char *niz, const char *omejevalnik, char **kontekst); |
| 3. | Za nadaljevanje uporablja ločilo. | Je ponovno vnesena različica strtok(). |
| 4. | Zahteva dva parametra. | Zahteva tri parametre. |
| 5. | Vrne kazalec na prvi najden žeton v nizu. | Vrne kazalec na prvi najden žeton v nizu. |
| 6. | Ni varen za niti. | Je varen za niti. |