Use a função strsep em C

Jinku Hu 12 outubro 2023
Use a função strsep em C

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

Use a função strsep para encontrar o token fornecido na string

strsep é parte dos utilitários de string de biblioteca padrão C definidos no arquivo de cabeçalho <string.h>. Ele pode ser utilizado para extrair tokens circundados pelos caracteres delimitadores fornecidos do objeto string.

strsep leva dois argumentos - ponteiro para char* e ponteiro para char*. O primeiro argumento é usado para passar o endereço da cadeia de caracteres que precisa ser pesquisada. O segundo parâmetro especifica um conjunto de caracteres delimitadores, que marcam o início e o fim dos tokens extraídos. Observe que os caracteres delimitadores são descartados nas strings de token extraídas. Quando o primeiro token é encontrado, o primeiro argumento é modificado para armazenar o ponteiro para o próximo delimitador encontrado.

No exemplo a seguir, demonstramos como extrair dois tokens delimitados com o caractere fornecido usando a única chamada para strsep. Observe que o programa pega a string e o delimitador definidos a partir dos 2 argumentos da linha de comando e sai com falha se não for fornecido conforme necessário. Em seguida, duplicamos a string com a chamada de função strdupa, pois strsep modifica o ponteiro passado e não queremos perder o valor original. strdupa aloca memória dinâmica na pilha, e o chamador não deve liberar o ponteiro retornado dela.

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

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

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

  str1 = strdupa(argv[1]);
  if (!str1) exit(EXIT_FAILURE);

  token = strsep(&str1, argv[2]);
  if (token == NULL) exit(EXIT_FAILURE);

  printf("extracted: '%s'\n", token);
  printf("left: '%s'\n", str1);

  exit(EXIT_SUCCESS);
}

Comando de amostra:

./program "hello there" t

Resultado:

extracted: 'hello '
left: 'here'

Como alternativa, podemos implementar o loop for que chama a função strsep consecutivamente e extrai cada token com os delimitadores fornecidos, em vez de apenas aquele encontrado primeiro - como visto no código de exemplo anterior. Observe, porém, que strsep retorna uma string vazia quando dois caracteres delimitadores estão em uma linha; portanto, o chamador é responsável por verificar isso antes de processar os tokens de resultado. Funcionalidades semelhantes com pequenas diferenças também são fornecidas usando as funções de biblioteca strtok e strtok_r descritas em detalhes nesta página.

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

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

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

  str1 = strdupa(argv[1]);
  if (!str1) exit(EXIT_FAILURE);

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

  exit(EXIT_SUCCESS);
}

Comando de amostra:

./program "hello there" tl

Resultado:

1: 'he'
2: ''
3: 'o '
4: 'here'
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