strtok() i strtok_r() funcions en C amb exemples
C proporciona dues funcions strtok() i strtok_r() per dividir una cadena per algun delimitador. Dividir una cadena és una tasca molt habitual. Per exemple, tenim una llista d'elements separats per comes d'un fitxer i volem elements individuals en una matriu.
Funció strtok().
El mètode strtok() divideix str[] segons els delimitadors donats i retorna el següent testimoni. S'ha de cridar en un bucle per obtenir totes les fitxes. Torna NULL quan no hi ha més fitxes.
Sintaxi de strtok()
char * strtok (char * str , const char * delims );
Paràmetres
- str : És el punter a la cadena que s'ha de marcar. delims : és una cadena que conté tots els delimitadors.
Valor de retorn
- Retorna el punter al primer testimoni trobat a la cadena.
- Retorna NULL si no s'han trobat més fitxes.
Exemples de strtok()
Exemple 1: Programa C per demostrar com dividir una cadena utilitzant 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;> }> |
Sortida
Geeks for Geeks
Exemple 2: Programa per a demostrar l'ús de la funció strtok() per tokenitzar una cadena basada en un delimitador.
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);> }> |
Sortida
Geeks for geeks Contribute
Aplicació pràctica de strtok()
strtok() es pot utilitzar per dividir una cadena en diverses cadenes basades en alguns separadors. A fitxer CSV senzill el suport es podria implementar mitjançant aquesta funció. Els fitxers CSV tenen comes com a delimitadors.
Exemple 3: C Programa per demostrar l'ús de la funció strtok() en C per implementar a fitxer CSV senzill.
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);> }> |
Sortida
1997, Ford, E350, ac, 3000.00,
Funció strtok_r().
Igual que la funció strtok() a C, strtok_r() fa la mateixa tasca d'analitzar una cadena en una seqüència de fitxes. strtok_r() és una versió reentrant de strtok(), per tant, és segura per a fils.
Sintaxi de strtok_r()
char * strtok_r (char * str , const char * delim , char ** saveptr );
Paràmetres
- str : És el punter a la cadena que s'ha de marcar. delims : és una cadena que conté tots els delimitadors. saveptr : És un punter a una variable char * que s'utilitza internament per strtok_r() per tal de mantenir el context entre trucades successives que analitzen la mateixa cadena.
Valor de retorn
- Retorna el punter al primer testimoni trobat a la cadena.
- Retorna NULL si no s'han trobat més fitxes.
Exemples de strtok_r()
Exemple 1: un programa C simple per mostrar l'ús de 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);> }> |
Sortida
Geeks for Geeks
Tokenització imbricada a C
Exemple 2: El programa C següent demostra l'ús de la funció strtok_r() per a la tokenització imbricada.
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;> }> |
Sortida
Outer Token: Hello, World Inner Token: Hello Inner Token: World Outer Token: Geeks for Geeks Inner Token: Geeks Inner Token: for Inner Token: Geeks
Diferència entre strtok() i strtok_r()
Vegem les diferències entre les funcions strtok() i strtok_r() en forma tabular, tal com es mostra a continuació:
| S.No. | strtok() | strtok_r() |
|---|---|---|
| 1. | S'utilitza per trencar la cadena de cadena en una sèrie de fitxes. | S'utilitza per descodificar una cadena en un patró per a fitxes. |
| 2. | La sintaxi és la següent: char *strtok(char *str, const char *delim) | La seva sintaxi és la següent: char *strtok_r(char *cadena, const char *limitador, char **context); |
| 3. | Utilitza el delimitador per continuar. | És una variant que s'ha tornat a introduir de strtok(). |
| 4. | Pren dos paràmetres. | Es necessita tres paràmetres. |
| 5. | Retorna un punter al primer testimoni trobat a la cadena. | Retorna un punter al primer testimoni trobat a la cadena. |
| 6. | No és segur per a fils. | És segur per a fils. |