Utilice la función strsep en C

Jinku Hu 12 octubre 2023
Utilice la función strsep en C

Este artículo demostrará varios métodos sobre cómo utilizar la función strsep en C.

Utilice la función strsep para encontrar el token dado en la cadena

strsep es parte de las utilidades de cadena de la biblioteca estándar de C definidas en el archivo de encabezado <string.h>. Se puede utilizar para extraer tokens rodeados por los caracteres delimitadores dados del objeto de cadena.

strsep toma dos argumentos: puntero a char * y puntero a char. El primer argumento se usa para pasar la dirección de la cadena de caracteres que debe buscarse. El segundo parámetro especifica un conjunto de caracteres delimitadores, que marcan el comienzo y el final de los tokens extraídos. Tenga en cuenta que los caracteres delimitadores se descartan en las cadenas de tokens extraídas. Cuando se encuentra el primer token, el primer argumento se modifica para almacenar el puntero al siguiente delimitador encontrado.

En el siguiente ejemplo, demostramos cómo extraer dos tokens delimitados con el carácter dado usando la única llamada a strsep. Observe que el programa toma la cadena y el conjunto delimitador de los 2 argumentos de la línea de comando y sale con falla si no se proporciona según sea necesario. A continuación, duplicamos la cadena con la llamada a la función strdupa ya que strsep modifica el puntero pasado, y no queremos perder el valor original. strdupa asigna memoria dinámica en la pila, y la persona que llama no debe liberar el puntero devuelto por ella.

#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 muestra:

./program "hello there" t

Producción :

extracted: 'hello '
left: 'here'

Alternativamente, podemos implementar el bucle for que llama a la función strsep consecutivamente y extrae cada token con los delimitadores dados en lugar de solo el que se encontró primero, como se ve en el código de ejemplo anterior. Sin embargo, tenga en cuenta que strsep devuelve una cadena vacía cuando hay dos caracteres delimitadores en una fila; por lo tanto, la persona que llama es responsable de verificar esto antes de procesar los tokens de resultado. También se proporciona una funcionalidad similar con ligeras diferencias utilizando las funciones de biblioteca strtok y strtok_r descritas en detalle en esta 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 muestra:

./program "hello there" tl

Producción :

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

Artículo relacionado - C String