logo

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)

cómo leer desde un archivo csv en java
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.