Usa la funzione strtok in C
-
Usa la funzione
strtok
per tokenizzare una stringa con un delimitatore dato -
Usa la funzione
strtok_r
per tokenizzare una stringa con due delimitatori
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
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