HOWTO · C

Uso de la función strtok en C

Este artículo presenta cómo utilizar la función strtok en C

Este artículo demostrará múltiples métodos sobre cómo usar la función strtok en C.

Usar la función strtok para tokenizar una cadena con un delimitador dado

La función strtok es parte de la biblioteca estándar de C definida en el archivo de cabecera <string.h>. Rompe la cadena dada en tokens divididos por el delimitador especificado. strtok toma dos argumentos: un puntero a la cadena que se va a dividir en tokens como primer parámetro y la cadena delimitadora como segundo. Tenga en cuenta que la cadena delimitadora se procesa como un conjunto de caracteres, denotando al delimitador separado. La función devuelve el puntero a una cadena terminada en cero, que representa el siguiente token. Sin embargo, cuando la misma cadena es analizada con múltiples llamadas a strtok, el primer argumento del puntero debe ser NULL después de la llamada inicial a la función.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  char *str1, *token;
  int j;

  if (argc != 3) {
    fprintf(stderr, "Usage: %s string delim\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  for (j = 1, str1 = argv[1];; j++, str1 = NULL) {
    token = strtok(str1, argv[2]);
    if (token == NULL) break;
    printf("%d: %s\n", j, token);
  }

  exit(EXIT_SUCCESS);
}

Ejemplo de comando:

./program "Temporary string to be parsed" " "

Producción :

1: Temporary
2: string
3: to
4: be
5: parsed

Usar la función strtok_r para analizar una cadena con dos delimitadores

Como alternativa, existe otra versión de la función llamada strtok_r, que es una variante reentrante más adecuada para programas multihilo. Ambas funciones modifican la cadena pasada como primer argumento, y no pueden ser sobre cadenas constantes. El siguiente código de ejemplo tokeniza la cadena dada en una jerarquía de dos niveles. El primero consiste en tokens divididos en los delimitadores pasados como segundo argumento al programa. El bucle interno divide cada uno de los tokens de la tokenización inicial y, finalmente, el programa envía los resultados a la consola.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  char *str1, *str2, *token, *subtoken;
  char *saveptr1, *saveptr2;
  int j;

  if (argc != 4) {
    fprintf(stderr, "Usage: %s string delim subdelim\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  for (j = 1, str1 = argv[1];; j++, str1 = NULL) {
    token = strtok_r(str1, argv[2], &saveptr1);
    if (token == NULL) break;
    printf("%d: %s\n", j, token);

    for (str2 = token;; str2 = NULL) {
      subtoken = strtok_r(str2, argv[3], &saveptr2);
      if (subtoken == NULL) break;
      printf(" --> %s\n", subtoken);
    }
  }

  exit(EXIT_SUCCESS);
}

Ejemplo de comando:

./program "Temporary string to be parsed" " " "aeio"

Producción :

1: Temporary
 --> T
 --> mp
 --> r
 --> ry
2: string
 --> str
 --> ng
3: to
 --> t
4: be
 --> b
5: parsed
 --> p
 --> rs
 --> d