Usa la funzione strtok in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione strtok per tokenizzare una stringa con un delimitatore dato
  2. Usa la funzione strtok_r per tokenizzare una stringa con due delimitatori
Usa la funzione strtok in C

Questo articolo mostrerà diversi metodi su come utilizzare la funzione strtok in C.

Usa la funzione strtok per tokenizzare una stringa con un delimitatore dato

La funzione strtok fa parte della libreria standard C definita nel file di intestazione <string.h>. Spezza la stringa data in token divisi dal delimitatore specificato. strtok accetta due argomenti: un puntatore alla stringa da tokenizzare come primo parametro e la stringa delimitatore come secondo. Si noti che, la stringa delimitatore viene elaborata come un insieme di caratteri, indicando il delimitatore separato. La funzione restituisce il puntatore a una stringa con terminazione null, che rappresenta il token successivo. Attenzione però, quando la stessa stringa viene analizzata con più chiamate strtok, il primo argomento del puntatore deve essere NULL dopo la chiamata iniziale della funzione.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  char *str1, *token;
  int j;

  if (argc != 3) {
    fprintf(stderr, "Usage: %s string delim\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  for (j = 1, str1 = argv[1];; j++, str1 = NULL) {
    token = strtok(str1, argv[2]);
    if (token == NULL) break;
    printf("%d: %s\n", j, token);
  }

  exit(EXIT_SUCCESS);
}

Comando di esempio:

./program "Temporary string to be parsed" " "

Produzione:

1: Temporary
2: string
3: to
4: be
5: parsed

Usa la funzione strtok_r per tokenizzare una stringa con due delimitatori

In alternativa, è disponibile un’altra versione della funzione chiamata strtok_r, che è una variante rientrante più adatta per programmi multi-thread. Entrambe queste funzioni modificano la stringa passata come primo argomento e non possono essere su stringhe costanti. Il codice di esempio seguente tokenizza la stringa data in una gerarchia a due livelli. Il primo è costituito da token suddivisi sui delimitatori passati come secondo argomento al programma. Il bucle interno divide ogni token dalla tokenizzazione iniziale e, infine, il programma invia i risultati alla console.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  char *str1, *str2, *token, *subtoken;
  char *saveptr1, *saveptr2;
  int j;

  if (argc != 4) {
    fprintf(stderr, "Usage: %s string delim subdelim\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  for (j = 1, str1 = argv[1];; j++, str1 = NULL) {
    token = strtok_r(str1, argv[2], &saveptr1);
    if (token == NULL) break;
    printf("%d: %s\n", j, token);

    for (str2 = token;; str2 = NULL) {
      subtoken = strtok_r(str2, argv[3], &saveptr2);
      if (subtoken == NULL) break;
      printf(" --> %s\n", subtoken);
    }
  }

  exit(EXIT_SUCCESS);
}

Comando di esempio:

./program "Temporary string to be parsed" " " "aeio"

Produzione:

1: Temporary
 --> T
 --> mp
 --> r
 --> ry
2: string
 --> str
 --> ng
3: to
 --> t
4: be
 --> b
5: parsed
 --> p
 --> rs
 --> d
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