Uso de la función strtok en C

Jinku Hu 12 octubre 2023
  1. Usar la función strtok para tokenizar una cadena con un delimitador dado
  2. Usar la función strtok_r para analizar una cadena con dos delimitadores
Uso de 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C String