C Academy · Oppitunti

strtok ja tokenisointi

Jaa merkkijonoja.

Oppitunti 3/413 vaihetta

strtok ja tokenisointi on ilmainen C Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C Academy-kurssilla on yhteensä 4 oppituntia.

Mitä tokenisointi tarkoittaa?

Tokenisointi tarkoittaa merkkijonon jakamista pienempiin osiin eli tokeneihin erotinmerkkien kohdalta.

Esimerkiksi merkkijonon "a,b,c" jakaminen pilkkujen kohdalta tuottaa tokenit a, b ja c. C tarjoaa tähän funktion 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;
}

strtok-funktion määrittely

char *strtok(char *str, const char *delim);

Ensimmäisellä kutsukerralla funktiolle annetaan merkkijono. Seuraavilla kutsukerroilla annetaan NULL, jolloin käsittely jatkuu siitä, mihin se jäi. Funktio palauttaa seuraavan tokenin tai arvon NULL, kun kaikki tokenit on käsitelty.

#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 muuttaa merkkijonoa

Tärkeää: strtok muuttaa alkuperäistä merkkijonoa. Se korvaa jokaisen erottimen merkillä '\0' ja palauttaa osoittimia samaan puskuriin.

Tämän vuoksi ette voi tokenisoida merkkijonovakiota, kuten "a,b", koska se on vain luku -muodossa.

#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;
}

Luokaa muokattava kopio

Koska strtok tuhoaa syötteensä, kopioikaa merkkijono ensin, jos tarvitsette alkuperäistä myöhemmin.

Käyttäkää paikallista char-taulukkoa tai kopioikaa merkkijono strcpy-funktiolla puskuriin.

#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;
}

Useita erottimia

delim-argumentti on merkkien joukko, ei merkkijono. Jokainen joukkoon kuuluva merkki toimii erottimena.

Niinpä " ,;" jakaa merkkijonon yhtä aikaa välilyöntien, pilkkujen ja puolipisteiden kohdalta.

#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;
}

Peräkkäiset erottimet

strtok käsittelee peräkkäisten erottimien jaksot yhtenä erottimena ja ohittaa tyhjät tokenit.

Siksi "a,,b" tuottaa vain tokenit a ja b, ei niiden väliin tyhjää tokenia. Ottakaa tämä huomioon CSV-jäsentämisessä, jossa tyhjillä kentillä on merkitystä.

#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;
}

Tokenien laskeminen

Yleinen tehtävä on laskea, kuinka monta tokenia merkkijono sisältää. Kasvattakaa laskuria silmukan sisällä.

#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 säilyttää piilotetun tilan

strtok tallentaa sijaintinsa staattiseen sisäiseen muuttujaan. Siksi NULL jatkaa edellisen merkkijonon käsittelyä.

Haittapuolena on, että funktio ei ole uudelleenkutsuttava eikä säieturvallinen. Ette voi tokenisoida kahta merkkijonoa samanaikaisesti.

#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;
}

Tokenien tallentaminen

Jos haluatte käyttää tokeneita jakamisen jälkeen, tallentakaa palautetut osoittimet taulukkoon. Ne osoittavat nyt muokattuun lähdepuskuriin, jonka on säilyttävä käytössä.

#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;
}

Uudelleenkutsuttava vaihtoehto

POSIX tarjoaa funktion strtok_r, joka saa piilotetun tilan sijaan eksplisiittisen char **saveptr-argumentin. Tämän ansiosta sitä voidaan käyttää turvallisesti sisäkkäin ja eri säikeissä.

Siirrettävässä standardinmukaisessa C:ssä tavallinen strtok sopii yksivaiheiseen jäsentämiseen.

#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;
}

Käytännössä: polun jakaminen

Tokenisointi on hyödyllistä jäsennellyn tekstin, kuten tiedostopolkujen, käsittelyssä. Jakamalla polun merkin / kohdalta saatte näkyviin sen jokaisen osan.

#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;
}

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte strtok-funktion toiminnan.

Kertaus

Opitte jakamaan merkkijonoja strtok-funktiolla:

  • Ensimmäinen kutsu saa merkkijonon; myöhemmät kutsut saavat arvon NULL.
  • Funktio muuttaa syötettä ja korvaa erottimet merkeillä '\0' — kopioikaa vain luku -merkkijonot ensin.
  • Erottimia sisältävä argumentti on joukko; peräkkäiset erottimet yhdistetään.
  • Funktio käyttää staattista tilaa eikä ole säieturvallinen; käyttäkää tarvittaessa strtok_r-funktiota.
Aloita maksutta

Opi C tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
39
Oppitunnit
144

Usein kysytyt kysymykset

Onko oppitunti ”strtok ja tokenisointi” ilmainen?

Kyllä – oppitunnin ”strtok ja tokenisointi” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C Academy-kurssin, päivitä CoddyKit PROhon. C Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”strtok ja tokenisointi”?

Jaa merkkijonoja. Harjoittelet C Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”strtok ja tokenisointi”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C Academy-oppitunnilla?

Kyllä. Jokainen C Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. strlen, strcpy, strcat
  2. strcmp ja vertailu
  3. strtok ja tokenisointi
  4. memcpy ja memset
← Takaisin: C Academy