Usa la funzione strsep in C
Questo articolo mostrerà diversi metodi su come utilizzare la funzione strsep
in C.
Usa la funzione strsep
per trovare il token fornito nella stringa
strsep
fa parte delle utilità di stringa della libreria standard C definite nel file di intestazione <string.h>
. Può essere utilizzato per estrarre i token circondati dai caratteri delimitatori dati dall’oggetto stringa.
strsep
richiede due argomenti: puntatore a char*
e puntatore a char*
. Il primo argomento viene utilizzato per passare l’indirizzo della stringa di caratteri che deve essere ricercata. Il secondo parametro specifica un set di caratteri delimitatori, che contrassegnano l’inizio e la fine dei token estratti. Notare che i caratteri delimitatori vengono eliminati nelle stringhe di token estratte. Quando viene trovato il primo token, il primo argomento viene modificato per memorizzare il puntatore al delimitatore successivo trovato.
Nell’esempio seguente, mostriamo come estrarre due token delimitati dal carattere dato utilizzando la singola chiamata a strsep
. Si noti che il programma prende la stringa e il delimitatore impostati dai 2 argomenti della linea di comando ed esce con esito negativo se non viene fornito come necessario. Successivamente, duplichiamo la stringa con la chiamata alla funzione strdupa
poiché strsep
modifica il puntatore passato e non vogliamo perdere il valore originale. strdupa
alloca la memoria dinamica sullo stack e il chiamante non dovrebbe liberare il puntatore restituito da esso.
#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 di esempio:
./program "hello there" t
Produzione:
extracted: 'hello '
left: 'here'
In alternativa, possiamo implementare il cicli for
che chiama la funzione strsep
consecutivamente ed estrae ogni token con i delimitatori dati piuttosto che solo quello incontrato per primo - come visto nel codice di esempio precedente. Nota però che strsep
restituisce una stringa vuota quando due caratteri delimitatori sono in una linea; quindi, il chiamante è responsabile di verificarlo prima di elaborare i token di risultato. Funzionalità simili con lievi differenze sono fornite anche usando le funzioni di libreria strtok
e strtok_r
descritte in dettaglio in questa pagina.
#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 di esempio:
./program "hello there" tl
Produzione:
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