Utilisez la fonction strsep en C

Jinku Hu 12 octobre 2023
Utilisez la fonction strsep en C

Cet article présente plusieurs méthodes d’utilisation de la fonction strsep en C.

Utilisez la fonction strsep pour trouver le jeton donné dans la chaîne

strsep fait partie des utilitaires de chaîne standard de la bibliothèque C définis dans le fichier d’en-tête <string.h> . Il peut être utilisé pour extraire des jetons entourés par les caractères de délimitation donnés de l’objet chaîne.

strsep prend deux arguments - un pointeur sur char* et un pointeur sur char. Le premier argument est utilisé pour transmettre l’adresse de la chaîne de caractères à rechercher. Le deuxième paramètre spécifie un ensemble de caractères de délimitation, qui marquent le début et la fin des jetons extraits. Notez que les caractères de délimitation sont ignorés dans les chaînes de jetons extraites. Lorsque le premier jeton est trouvé, le premier argument est modifié pour stocker le pointeur vers le séparateur suivant trouvé.

Dans l’exemple suivant, nous montrons comment extraire deux jetons délimités par le caractère donné à l’aide de l’appel unique à strsep. Notez que le programme prend la chaîne et le délimiteur définis à partir des 2 arguments de ligne de commande et se termine avec un échec s’il n’est pas fourni si nécessaire. Ensuite, nous dupliquons la chaîne avec l’appel de fonction strdupa car le strsep modifie le pointeur passé, et nous ne voulons pas perdre la valeur d’origine. strdupa alloue de la mémoire dynamique sur la pile, et l’appelant ne doit pas libérer le pointeur renvoyé par celle-ci.

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

Exemple de commande:

./program "hello there" t

Production:

extracted: 'hello '
left: 'here'

Alternativement, nous pouvons implémenter la boucle for qui appelle la fonction strsep consécutivement et extrait chaque jeton avec les délimiteurs donnés plutôt que celui rencontré en premier - comme vu dans l’exemple de code précédent. Notez cependant que strsep renvoie une chaîne vide lorsque deux caractères de délimitation sont dans une ligne; ainsi, l’appelant est responsable de vérifier cela avant de traiter les jetons de résultat. Des fonctionnalités similaires avec de légères différences sont également fournies en utilisant les fonctions de bibliothèque strtok et strtok_r décrites en détail sur cette page.

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

Exemple de commande:

./program "hello there" tl

Production:

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

Article connexe - C String