strtok() și strtok_r() funcții în C cu exemple
C oferă două funcții strtok() și strtok_r() pentru împărțirea unui șir cu un delimitator. Împărțirea unui șir este o sarcină foarte comună. De exemplu, avem o listă de elemente separate prin virgulă dintr-un fișier și dorim elemente individuale într-o matrice.
Funcția strtok().
Metoda strtok() împarte str[] în funcție de delimitatorii dați și returnează următorul token. Trebuie apelat într-o buclă pentru a obține toate jetoanele. Returnează NULL atunci când nu mai există jetoane.
Sintaxa lui strtok()
char * strtok (char * str , const char * delims );
Parametrii
- str : este indicatorul către șirul care urmează să fie tokenizat. delims : este un șir care conține toți delimitatorii.
Valoare returnată
- Acesta returnează indicatorul la primul simbol întâlnit în șir.
- Returnează NULL dacă nu mai sunt găsite tokenuri.
Exemple de strtok()
Exemplul 1: C Program pentru a demonstra cum să împărțiți un șir folosind 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;> }> |
Ieșire
Geeks for Geeks
Exemplul 2: Programul care demonstrează utilizarea funcției strtok() pentru a tokeniza un șir pe baza unui delimitator.
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);> }> |
Ieșire
Geeks for geeks Contribute
Aplicarea practică a strtok()
strtok() poate fi folosit pentru a împărți un șir în mai multe șiruri pe baza unor separatori. A fișier CSV simplu suportul poate fi implementat folosind această funcție. Fișierele CSV au virgule ca delimitatori.
Exemplul 3: C Program pentru a demonstra utilizarea funcției strtok() în C pentru a implementa a fișier CSV simplu.
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);> }> |
Ieșire
1997, Ford, E350, ac, 3000.00,
Funcția strtok_r().
La fel ca funcția strtok() din C, strtok_r() face aceeași sarcină de a analiza un șir într-o secvență de jetoane. strtok_r() este o versiune reintrată a lui strtok(), prin urmare este sigură pentru fire.
Sintaxa lui strtok_r()
char * strtok_r (char * str , const char * delim , char ** saveptr );
Parametrii
- str : este indicatorul către șirul care urmează să fie tokenizat. delims : este un șir care conține toți delimitatorii. saveptr : Este un pointer către o variabilă char * care este utilizată intern de strtok_r() pentru a menține contextul între apelurile succesive care parsează același șir.
Valoare returnată
- Acesta returnează indicatorul la primul simbol întâlnit în șir.
- Returnează NULL dacă nu mai sunt găsite tokenuri.
Exemple de strtok_r()
Exemplul 1: un program simplu C pentru a arăta utilizarea lui 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);> }> |
Ieșire
Geeks for Geeks
Imbricat-Tokenizare în C
Exemplul 2: Programul C de mai jos demonstrează utilizarea funcției strtok_r() pentru tokenizarea imbricată.
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;> }> |
Ieșire
Outer Token: Hello, World Inner Token: Hello Inner Token: World Outer Token: Geeks for Geeks Inner Token: Geeks Inner Token: for Inner Token: Geeks
Diferența dintre strtok() și strtok_r()
Să vedem diferențele dintre funcțiile strtok() și strtok_r() într-o formă tabelară, așa cum se arată mai jos:
| Da nu. | strtok() | strtok_r() |
|---|---|---|
| 1. | Este folosit pentru a rupe string str într-o serie de jetoane. | Este folosit pentru a decoda un șir într-un model pentru jetoane. |
| 2. | Sintaxa este următoarea: char *strtok(char *str, const char *delim) | Sintaxa sa este următoarea: char *strtok_r(char *string, const char *limiter, char **context); |
| 3. | Folosește delimitatorul pentru a continua. | Este o variantă reintrodusă a strtok(). |
| 4. | Este nevoie de doi parametri. | Este nevoie de trei parametri. |
| 5. | Returnează un pointer către primul simbol găsit în șir. | Returnează un pointer către primul simbol găsit în șir. |
| 6. | Nu este sigur pentru fire. | Este sigur pentru fire. |