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'
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