strtok og tokenisering
Splitt strenger
strtok og tokenisering er en gratis leksjon i C Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C Academy inneholder totalt 4 leksjoner.
Hva er tokenisering?
Tokenisering betyr å dele en streng opp i mindre deler (tokens) som skilles av skilletegn.
Hvis du for eksempel deler "a,b,c" ved komma, får du tokenene a, b og c. C tilbyr strtok til dette.
#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;
}Signaturen til strtok
char *strtok(char *str, const char *delim);
Ved det første kallet sender du inn strengen. Ved senere kall sender du inn NULL, slik at funksjonen fortsetter der den slapp. Den returnerer neste token, eller NULL når den er ferdig.
#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 endrer strengen
Viktig: strtok endrer den opprinnelige strengen. Den erstatter hvert skilletegn med en '\0' og returnerer pekere inn i den samme bufferen.
Det betyr at du ikke kan tokenisere en strengliteral som "a,b", fordi den er skrivebeskyttet.
#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;
}Lag en skrivbar kopi
Fordi strtok ødelegger inndataene, bør du kopiere strengen først hvis du trenger originalen senere.
Bruk en lokal char-array eller kopier med strcpy til en 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;
}Flere skilletegn
Argumentet delim er et sett med tegn, ikke en sekvens. Alle tegn i settet fungerer som skilletegn.
Dermed deler " ,;" ved mellomrom, komma og semikolon samtidig.
#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;
}Fortløpende skilletegn
strtok behandler rekker med skilletegn som ett enkelt skilletegn og hopper over tomme tokens.
"a,,b" gir derfor bare a og b, ikke et tomt token mellom dem. Husk dette ved CSV-parsing, der tomme felt kan være viktige.
#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;
}Telle tokens
En vanlig oppgave er å telle hvor mange tokens en streng inneholder. Øk en teller inne i løkken.
#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 har skjult tilstand
strtok lagrer posisjonen sin i en statisk intern variabel. Derfor fortsetter NULL behandlingen av den forrige strengen.
Ulempen er at funksjonen ikke er reentrant og ikke er trådsikker. Du kan ikke tokenisere to strenger samtidig.
#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;
}Lagre tokens
Hvis du vil bruke tokens etter oppdelingen, kan du lagre de returnerte pekerne i en array. De peker inn i kildebufferen, som nå er endret, og denne må derfor fortsatt eksistere.
#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;
}Det reentrante alternativet
POSIX tilbyr strtok_r, som tar en eksplisitt char **saveptr i stedet for skjult tilstand. Dette gjør funksjonen trygg å nøste og bruke på tvers av tråder.
I portabel standard-C er vanlig strtok et godt valg ved parsing i én gjennomgang.
#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;
}Praktisk: dele opp en sti
Tokenisering er nyttig når du tolker strukturert tekst, for eksempel filstier. Ved å dele ved / får du frem hver enkelt sti-komponent.
#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;
}Hurtigsjekk
Test forståelsen din av hvordan strtok fungerer.
Oppsummering
Du har lært å dele opp strenger med strtok:
- Det første kallet tar strengen; senere kall tar NULL.
- Funksjonen endrer inndataene ved å erstatte skilletegn med
'\0'— kopier skrivebeskyttede strenger først. - Argumentet for skilletegn er et sett; fortløpende skilletegn slås sammen.
- Funksjonen bruker statisk tilstand og er ikke trådsikker; bruk
strtok_rved behov.
Lær deg C med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 39
- Leksjoner
- 144
Ofte stilte spørsmål
Er leksjonen «strtok og tokenisering» gratis?
Ja – hele teksten i «strtok og tokenisering» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «strtok og tokenisering»?
Splitt strenger Du øver på C Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med C Academy?
Ingen tidligere erfaring er nødvendig. C Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «strtok og tokenisering»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne C Academy-leksjonen?
Ja. Alle C Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- strlen, strcpy, strcat
- strcmp og sammenligning
- strtok og tokenisering
- memcpy og memset