Funciones strtok() y strtok_r() en C con ejemplos
C proporciona dos funciones strtok() y strtok_r() para dividir una cadena por algún delimitador. Dividir una cadena es una tarea muy común. Por ejemplo, tenemos una lista de elementos separados por comas de un archivo y queremos elementos individuales en una matriz.
Función strtok()
El método strtok() divide str[] según los delimitadores dados y devuelve el siguiente token. Debe llamarse en un bucle para obtener todos los tokens. Devuelve NULL cuando no hay más tokens.
Sintaxis de strtok()
char * strtok (char * str , const char * delims );
Parámetros
- str: es el puntero a la cadena que se va a tokenizar. delims: es una cadena que contiene todos los delimitadores.
Valor de retorno
- Devuelve el puntero al primer token encontrado en la cadena.
- Devuelve NULL si no se encuentran más tokens.
Ejemplos de strtok()
Ejemplo 1: Programa C para demostrar cómo dividir una cadena usando 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;> }> |
Producción
Geeks for Geeks
Ejemplo 2: Programa para demostrar el uso de la función strtok() para tokenizar 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);> }> |
Producción
Geeks for geeks Contribute
Aplicación práctica de strtok()
strtok() se puede utilizar para dividir una cadena en varias cadenas según algunos separadores. A archivo CSV sencillo El soporte podría implementarse utilizando esta función. Los archivos CSV tienen comas como delimitadores.
Ejemplo 3: Programa C para demostrar el uso de la función strtok() en C para implementar un archivo CSV sencillo.
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);> }> |
Producción
1997, Ford, E350, ac, 3000.00,
Función strtok_r()
Al igual que la función strtok() en C, strtok_r() realiza la misma tarea de analizar una cadena en una secuencia de tokens. strtok_r() es una versión reentrante de strtok(), por lo que es segura para subprocesos.
Sintaxis de strtok_r()
char * strtok_r (char * str , const char * delim , char ** saveptr );
Parámetros
- str: es el puntero a la cadena que se va a tokenizar. delims: es una cadena que contiene todos los delimitadores. saveptr: es un puntero a una variable char * que strtok_r() utiliza internamente para mantener el contexto entre llamadas sucesivas que analizan la misma cadena.
Valor de retorno
- Devuelve el puntero al primer token encontrado en la cadena.
- Devuelve NULL si no se encuentran más tokens.
Ejemplos de strtok_r()
Ejemplo 1: un programa C simple para mostrar el uso 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);> }> |
Producción
Geeks for Geeks
Tokenización anidada en C
Ejemplo 2: El siguiente programa en C demuestra el uso de la función strtok_r() para la tokenización anidada.
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;> }> |
Producción
Outer Token: Hello, World Inner Token: Hello Inner Token: World Outer Token: Geeks for Geeks Inner Token: Geeks Inner Token: for Inner Token: Geeks
Diferencia entre strtok() y strtok_r()
Veamos las diferencias entre las funciones strtok() y strtok_r() en forma de tabla como se muestra a continuación:
| S.No. | strtok() | strtok_r() |
|---|---|---|
| 1. | Se utiliza para dividir una cadena en una serie de tokens. | Se utiliza para decodificar una cadena en un patrón de tokens. |
| 2. | La sintaxis es la siguiente: char *strtok(char *str, const char *delim) | Su sintaxis es la siguiente: char *strtok_r(char *cadena, const char *limitador, char **contexto); |
| 3. | Utiliza el delimitador para continuar. | Es una variante reingresada de strtok(). |
| 4. | Se necesitan dos parámetros. | Se necesitan tres parámetros. |
| 5. | Devuelve un puntero al primer token encontrado en la cadena. | Devuelve un puntero al primer token encontrado en la cadena. |
| 6. | No es seguro para subprocesos. | Es seguro para subprocesos. |