Usa la funzione strsep in C

Jinku Hu 12 ottobre 2023
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'
Autore: 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

Articolo correlato - C String