Use a função strtok em C

Jinku Hu 12 outubro 2023
  1. Use a função strtok para tokenizar string com determinado delimitador
  2. Use a função strtok_r para tokenizar string com dois delimitadores
Use a função strtok em C

Este artigo irá demonstrar vários métodos sobre como usar a função strtok em C.

Use a função strtok para tokenizar string com determinado delimitador

A função strtok é parte da biblioteca padrão C definida no arquivo de cabeçalho <string.h>. Ele divide a string fornecida em tokens divididos pelo delimitador especificado. strtok leva dois argumentos - um ponteiro para a string a ser tokenizada como o primeiro parâmetro e a string delimitadora como o segundo. Observe que a string do delimitador é processada como um conjunto de caracteres, denotando o delimitador separado. A função retorna o ponteiro para uma string terminada em nulo, que representa o próximo token. Lembre-se, porém, de que quando a mesma string é analisada com várias chamadas strtok, o primeiro argumento do ponteiro deve ser NULL após a chamada de função inicial.

#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);
}

Comando de amostra:

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

Resultado:

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

Use a função strtok_r para tokenizar string com dois delimitadores

Alternativamente, outra versão da função está disponível, chamada strtok_r, que é uma variante reentrante mais adequada para programas multi-threaded. Ambas as funções modificam a string passada como o primeiro argumento e não podem estar em strings constantes. O código de exemplo a seguir simboliza a string fornecida em uma hierarquia de dois níveis. O primeiro consiste em tokens divididos nos delimitadores passados ​​como o segundo argumento para o programa. O loop interno divide cada token da tokenização inicial e, finalmente, o programa envia os resultados para o console.

#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);
}

Comando de amostra:

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

Resultado:

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

Artigo relacionado - C String