strtok en tokeniseren
Strings splitsen
strtok en tokeniseren is een gratis C Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C Academy bevat in totaal 4 lessen.
Wat is tokeniseren?
Tokeniseren betekent dat je een string opsplitst in kleinere delen (tokens), gescheiden door scheidingstekens.
Als je bijvoorbeeld "a,b,c" splitst op komma's, krijg je de tokens a, b en c. C biedt hiervoor strtok.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "a,b,c";
char *token = strtok(text, ",");
printf("First token: %s\n", token);
return 0;
}De strtok-signatuur
char *strtok(char *str, const char *delim);
Bij de eerste aanroep geef je de string door. Bij volgende aanroepen geef je NULL door, zodat de functie verdergaat waar ze was gebleven. De functie retourneert het volgende token, of NULL wanneer ze klaar is.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "red green blue";
char *tok = strtok(text, " ");
while (tok != NULL) {
printf("%s\n", tok);
tok = strtok(NULL, " ");
}
return 0;
}strtok wijzigt de string
Belangrijk: strtok wijzigt de oorspronkelijke string. De functie vervangt elk scheidingsteken door een '\0' en retourneert pointers naar dezelfde buffer.
Je kunt daarom geen stringliteral zoals "a,b" tokeniseren, omdat die alleen-lezen is.
#include <stdio.h>
#include <string.h>
int main(void) {
char data[] = "x:y:z";
strtok(data, ":");
printf("data[1] is now: %d (the null byte)\n", data[1]);
return 0;
}Maak een schrijfbare kopie
Omdat strtok de invoer vernietigt, moet je de string eerst kopiëren als je het origineel later nodig hebt.
Gebruik een lokale char-array of kopieer met strcpy naar een buffer.
#include <stdio.h>
#include <string.h>
int main(void) {
const char *original = "one-two-three";
char copy[64];
strcpy(copy, original);
char *tok = strtok(copy, "-");
while (tok) {
printf("%s\n", tok);
tok = strtok(NULL, "-");
}
printf("Original intact: %s\n", original);
return 0;
}Meerdere scheidingstekens
Het argument delim is een verzameling tekens, geen reeks. Elk teken in de verzameling werkt als scheidingsteken.
" ,;" splitst dus tegelijk op spaties, komma's en puntkomma's.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "a,b;c d";
char *tok = strtok(text, ",; ");
while (tok) {
printf("[%s]\n", tok);
tok = strtok(NULL, ",; ");
}
return 0;
}Opeenvolgende scheidingstekens
strtok behandelt reeksen scheidingstekens als één scheidingsteken en slaat lege tokens over.
"a,,b" levert dus alleen a en b op, niet een leeg token ertussen. Houd hier rekening mee bij het verwerken van CSV, waar lege velden belangrijk kunnen zijn.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "a,,b";
char *tok = strtok(text, ",");
while (tok) {
printf("token: %s\n", tok);
tok = strtok(NULL, ",");
}
return 0;
}Tokens tellen
Een veelvoorkomende taak is tellen hoeveel tokens een string bevat. Verhoog een teller binnen de lus.
#include <stdio.h>
#include <string.h>
int main(void) {
char sentence[] = "the quick brown fox";
int count = 0;
char *tok = strtok(sentence, " ");
while (tok) {
count++;
tok = strtok(NULL, " ");
}
printf("Word count: %d\n", count);
return 0;
}strtok bewaart verborgen toestand
strtok bewaart zijn positie in een statische interne variabele. Daarom gaat NULL verder met de vorige string.
Het nadeel is dat de functie niet herintreedbaar en niet thread-safe is. Je kunt niet twee strings tegelijk tokeniseren.
#include <stdio.h>
#include <string.h>
int main(void) {
char a[] = "1 2";
char *t = strtok(a, " ");
printf("%s\n", t);
t = strtok(NULL, " ");
printf("%s\n", t);
return 0;
}Tokens opslaan
Als je tokens na het splitsen wilt gebruiken, sla je de geretourneerde pointers op in een array. Ze wijzen naar de (nu gewijzigde) bronbuffer, die beschikbaar moet blijven.
#include <stdio.h>
#include <string.h>
int main(void) {
char csv[] = "name,age,city";
char *fields[10];
int n = 0;
char *tok = strtok(csv, ",");
while (tok && n < 10) {
fields[n++] = tok;
tok = strtok(NULL, ",");
}
for (int i = 0; i < n; i++)
printf("Field %d: %s\n", i, fields[i]);
return 0;
}Het herintreedbare alternatief
POSIX biedt strtok_r, die een expliciete char **saveptr gebruikt in plaats van verborgen toestand. Daardoor is de functie veilig te nesten en in meerdere threads te gebruiken.
Voor draagbare standaard-C is gewone strtok prima voor parseren in één doorgang.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "p:q:r";
char *save;
char *tok = strtok_r(text, ":", &save);
while (tok) {
printf("%s\n", tok);
tok = strtok_r(NULL, ":", &save);
}
return 0;
}Praktijk: een pad splitsen
Tokeniseren komt goed van pas bij het parseren van gestructureerde tekst, zoals bestandspaden. Door te splitsen op / krijg je elk padonderdeel afzonderlijk.
#include <stdio.h>
#include <string.h>
int main(void) {
char path[] = "usr/local/bin";
char *part = strtok(path, "/");
while (part) {
printf("-> %s\n", part);
part = strtok(NULL, "/");
}
return 0;
}Korte controle
Test je begrip van de werking van strtok.
Samenvatting
Je hebt geleerd strings te splitsen met strtok:
- De eerste aanroep krijgt de string; latere aanroepen krijgen NULL.
- De functie wijzigt de invoer en vervangt scheidingstekens door
'\0'— kopieer alleen-lezen strings eerst. - Het argument voor scheidingstekens is een verzameling; opeenvolgende scheidingstekens worden samengevoegd.
- De functie gebruikt statische toestand en is niet thread-safe; gebruik
strtok_rwanneer dat nodig is.
Leer C met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 39
- Lessen
- 144
Veelgestelde vragen
Is de les “strtok en tokeniseren” gratis?
Ja — de volledige tekst van “strtok en tokeniseren” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus C Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus C Academy bevat in totaal 4 lessen.
Wat leer ik in “strtok en tokeniseren”?
Strings splitsen Je oefent met C Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met C Academy te beginnen?
Ervaring vooraf is niet nodig. C Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “strtok en tokeniseren”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over C Academy?
Ja. Elke les over C Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- strlen, strcpy, strcat
- strcmp en vergelijken
- strtok en tokeniseren
- memcpy en memset