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