strtok-toiminnot. Miten strtok-funktio toimii C:ssä? Esimerkki: ohjelman lähdekoodi

Muut alias

strtok

ARVOSTELU

#sisältää

merkki *strok(merkki *str, const char *delim);
char *strtok_r(char *str, const char *delim,hiiltyä**saveptr);

Ominaisuuksien testausmakrolle glibc:n vaatimukset (katso ominaisuus_test_macros(7)):

strtok_r(): _SVID_SOURCE || _BSD_SOURCE || _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE

KUVAUS

Toiminto strtok() jakaa merkkijonon nollan tai useamman ei-tyhjän merkkijonon sekvenssiksi. Ensimmäisellä puhelulla strtok() analysoitava merkkijono on määritettävä argumentissa str. Jokaisessa myöhemmässä kutsussa, joka jäsentää samaa merkkijonoa, arvo str on oltava NULL.

Väitteessä delim määritetään joukko tavuja, joita pidetään tunnisteerottimina analysoitavassa merkkijonossa. Soittaja voi määrittää eri linjoja delim myöhemmissä kutsuissa, kun jäsennetään samaa merkkijonoa.

Jokainen puhelu strtok() palauttaa osoittimen nollapäätteiseen merkkijonoon, joka sisältää seuraavan merkin. Tämä rivi ei sisällä erotintavua. Jos tokeneja ei ole enää, niin strtok() palauttaa NULL:n.

Puhelujärjestys strtok(), jotka toimivat yhdellä merkkijonolla, ylläpitävät osoitinta, joka määrittää pisteen, josta seuraavan merkin haku alkaa. Ensimmäinen soitto strtok() määrittää tälle osoittimelle viittauksen merkkijonon ensimmäiseen tavuun. Seuraavan tunnuksen alku määräytyy etsimällä eteenpäin sisään str seuraava tavu ei ole erotin. Jos tavu löytyy, se otetaan seuraavan tokenin alkuun. Jos tällaista tavua ei löydy, ei ole enää tunnuksia ja strtok() palauttaa NULL-arvon (tyhjälle tai rajatulle merkkijonolle, jolloin NULL palautetaan ensimmäisen kerran kun sitä kutsutaan strtok()).

Jokaisen tunnuksen loppu löydetään eteenpäinhaulla, kunnes erotintavu tai sen lopussa oleva nollatavu ("\0") löytyy. Jos erotintavu löytyy, se korvataan nollatavulla nykyisen merkin päättämiseksi, ja strtok() tallentaa osoittimen seuraavaan tavuun; tätä osoitinta käytetään aloituspisteenä haettaessa seuraavaa merkkiä. Tässä tapauksessa strtok() palauttaa osoittimen löydetyn tunnuksen alkuun.

Yllä olevasta kuvauksesta seuraa, että kahden tai useamman peräkkäisen erotintavun sekvenssi skannattavalla rivillä katsotaan yhdeksi erottimeksi, ja merkkijonon alussa tai lopussa olevat erotintavut jätetään huomiotta. Toisin sanoen rahakkeet palasivat strtok() - aina ei-tyhjät merkkijonot. Eli esimerkiksi jos on rivi " aaa;;bbb,", sitten seuraavat puhelut strtok() annetuilla rivierottimilla " ;, "palauttaisi jouset" aaa"ja" bbb" ja sitten nollaosoitin.

Toiminto strtok_r() on palaava versio strtok(). Perustelu saveptr on osoitin muuttujaan char* jota käytetään sisäisesti strtok_r() ottaakseen huomioon seuraavien kutsujen välisen kontekstin samaa merkkijonoa jäsennettäessä.

Ensimmäisellä puhelulla strtok_r() merkitys str on osoitettava jäsennettävään merkkijonoon ja arvoon saveptr huomiotta. Seuraavissa puheluissa arvo str on oltava NULL ja arvo saveptr ei pitäisi muuttua edellisestä puhelusta.

Eri rivejä voidaan analysoida samanaikaisesti useilla ajoilla strtok_r() eri argumenteilla saveptr.

PALAUTUSARVO

Toiminnot strtok() Ja strtok_r() palauttaa osoittimen seuraavaan merkkiin tai NULL, jos merkkejä ei ole enää.

ATTRIBUUTIT

Katso tämän osan termien kuvaus, katso attribuutteja(7).
Käyttöliittymä Attribuutti Merkitys
strtok() harmittomuutta säikeissävaarallinen (MT-Unsafe race:strtok)
strtok_r() harmittomuutta säikeissävaaraton (MT-Safe)

VAATIMUSTENMUKAISUUS

strtok() POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD. strtok_r() POSIX.1-2001, POSIX.1-2008.

VIAT

Käytä näitä ominaisuuksia varoen. Huomaa, että: * Nämä funktiot muokkaavat ensimmäistä argumenttiaan. * Näitä toimintoja ei voi käyttää vakiomerkkijonojen kanssa. * Erotintavun tunniste on menetetty. * Toimintoa analysoitaessa strtok() käyttää staattista puskuria, joten se ei ole lankaturvallinen. Käyttää strtok_r() tässä tapauksessa.

ESIMERKKI

Alla oleva ohjelma käyttää sisäkkäisiä silmukoita kutsumiseen strtok_r() jakaa merkkijonon sen osakkeiksi. Ensimmäisessä parametrissa komentorivi analysoitava merkkijono on määritelty. Toinen parametri määrittää erotintavu(t), jota käytetään jakamaan merkkijono "yhdistetyiksi" tunnisteiksi. Kolmas parametri määrittää erotintavu(t), jota käytetään erottamaan "yhdistetyt" tunnukset alitunnuksiksi.

Esimerkki ohjelman tulosteesta:

$./a.out "a/bbb///cc;xxx:yyy:" ":;" "/" 1: a/bbb///cc --> a --> bbb --> cc 2: xxx --> xxx 3: yyy --> yyy

Ohjelman lähdekoodi

#sisältää #sisältää #sisältää int main(int argc, char *argv) ( char *str1, *str2, *token, *subtoken; char *saveptr1, *saveptr2; int j; if (argc != 4) ( fprintf(stderr, "Käyttö: % s string delim subdelim\n", argv); exit(EXIT_FAILURE); ) for (j = 1, str1 = argv; ; j++, str1 = NULL) ( token = strtok_r(str1, argv, &saveptr1); if (token = = NULL) break; printf("%d: %s\n", j, tunnus); for (str2 = tunnus; ; str2 = NULL) ( alitunnus = strtok_r(str2, argv, &saveptr2); if (alitunnus == NULL) break; printf(" --> %s\n", alitunnus); ) ) exit(EXIT_SUCCESS); )

Toinen esimerkki ohjelmasta, joka käyttää strtok(), löytyy osoitteesta getaddrinfo_a(3).

Strtok()-funktio palauttaa osoittimen str1:n osoittaman merkkijonon seuraavaan merkkiin. Merkit, jotka muodostavat str2:n osoittaman merkkijonon, ovat erottimia, jotka määrittelevät tunnuksen. Jos palautettavaa merkkiä ei ole, palautetaan tyhjä osoitin.

Versiossa C99 rajoitustunnusta sovelletaan str1- ja str2-parametreihin.

Jos haluat jakaa merkkijonon tokeneiksi, kun strtok() kutsutaan ensimmäistä kertaa, str1-parametrin on osoitettava merkkijonon alkuun. Myöhemmissä funktion kutsuissa on käytettävä nolla-osoitinta str1-parametrina. Tässä tapauksessa koko merkkijonoa muutetaan aina, kun funktiota kutsutaan.

Jokainen strtok()-funktion kutsu voi käyttää erilaista merkkien erottimia.

Strtok()-funktio tarjoaa keinon pelkistää merkkijonon sen osiin. Esimerkiksi seuraava ohjelma tokenisoi merkkijonon "Yksi, kaksi ja kolme".

#sisältää #sisältää int main(void) char *p; p = strtok("Yksi, kaksi ja kolme.", ","); printf(p); do ( p = strtok(NULL, ",. "); if(p) printf("|%s", p); ) while(p), palauttaa 0; )

Tämän ohjelman tulos on seuraava.

Yksi | kaksi | ja | kolme

Huomaa kuinka strtok-toiminto() kutsutaan ensin alkuperäisellä merkkijonolla, mutta sen myöhemmissä kutsuissa käytetään NULL-arvoa ensimmäisenä argumenttina. Strtok()-funktio säilyttää sisäisen osoittimen käsiteltävään merkkijonoon. Jos strtok():n ensimmäinen argumentti osoittaa merkkijonoon, sisäinen osoitin asetetaan tämän merkkijonon alkuun. Jos ensimmäinen argumentti on NULL, strtok() jatkaa edellisen merkkijonon käsittelyä alkaen edellisessä vaiheessa opitusta kohdasta ja siirtää sisäistä osoitinta eteenpäin, kun seuraava merkki haetaan. Siten strtok()-funktio "läpi" koko merkkijonon. Huomaa myös, kuinka erotinmerkkijono muuttuu funktion ensimmäisessä ja sitä seuraavissa kutsuissa. Erottimet voidaan määrittää eri tavalla kullekin kutsulle.

#sisältää merkki *strok(merkki * str1, const char * str2);

Strtok()-funktio palauttaa osoittimen parametrin osoittaman merkkijonon seuraavaan merkkiin str1. Merkit, jotka muodostavat parametrin osoittaman merkkijonon str2, ovat erottimia, jotka määrittelevät tunnuksen. Jos palautettavaa merkkiä ei ole, palautetaan tyhjä osoitin.

Versiossa C99 parametreihin str1 Ja str2 Rajoituksen tarkennetta sovelletaan.

Jos haluat jakaa merkkijonon tokeneiksi, kutsu parametria strtok() ensimmäisen kerran str1 on osoitettava tämän rivin alkuun. Seuraavassa kutsussa funktiota parametrina str1 sinun on käytettävä nolla-osoitinta. Tällä tavalla koko merkkijono jaetaan tokeneiksi.

Jokainen strtok()-funktion kutsu voi käyttää eri erottimia.

Esimerkki

Tämä ohjelma jakaa merkkijonon ”Ruoho on vihreää, aurinko paistaa” välilyönneillä ja pilkuilla erotetuiksi merkeiksi. Tulos tulee olemaan

Ruoho|muuttuu vihreäksi|aurinko|kimaltelee #sisältää #sisältää int main(void) ( char *p; p = strtok("Ruoho on vihreä, aurinko paistaa", " "); printf(p); do ( p = strtok("\0", ", ") ; if(p ) printf("|%s", p); ) while(p); palauttaa 0; )

Syntaksi:

#sisältää
char *strtok(char *str, const char *sep);

Argumentit:

str – osoitin jaettavaan merkkijonoon.
sep – osoitin merkkijonoon, joka sisältää joukon erotinmerkkejä.

Palautusarvo:

NULL – jos merkkijonoa str ei voi jakaa osiin.
Osoitin merkkijonon valitun osan ensimmäiseen merkkiin.

Kuvaus:

Strtok-funktio valitsee seuraavan osan merkkijonosta, johon str-argumentti osoittaa, erotettuna yhdellä sep-argumentin osoittamassa merkkijonossa määritetyistä erotinmerkeistä. Peräkkäiset kutsut strtok-funktiolle johtavat merkkijonon str jakamiseen osiin (tokeneihin).

"Ensimmäinen strtok-funktion kutsu määrittää jaettavan merkkijonon alun (str) ja erottimet sisältävän merkkijonon alun (sep). Strtok-funktio alkaa selaamalla merkkijonon str merkit yksi kerrallaan ja etsimällä merkkiä, joka ei sisälly erotettuun merkkijonoon sep. Jos merkkijonossa str havaitaan rivin loppumerkki ennen kuin merkkijonoon sep sisältymätön merkki on löydetty, merkkijonoa str ei voida jakaa osiin ja palautetaan nollaosoitin (NULL). Jos tällainen merkki löytyy, sen katsotaan olevan merkkijonon str ensimmäisen osan alku."

Seuraavaksi strtok-funktio etsii erottimen eli merkkijonon sep sisältyvän merkin. Jos tällaista merkkiä ei löydy, merkkijonon str katsotaan koostuvan yhdestä osasta ja merkkijonon str myöhemmät jaot palauttavat nollaosoittimen. Jos tällainen symboli löytyy. sitten se korvataan nollamerkillä (rivin lopun merkillä). Seuraavaksi strtok-funktio muistaa nykyisen sijainnin (osoitin merkkiin, josta seuraavan rivin osan haku alkaa) ja palauttaa osoittimen rivin ensimmäisen valitun osan alkuun.

Jos strtok-funktio palautti ei-null-osoittimen, voit jatkaa merkkijonon str jakamista osiin. Merkkijonon jakamisen jatkamiseksi kutsutaan uudelleen strtok-funktio, mutta jaettavaan merkkijonoon osoittavan osoittimen sijaan ensimmäiseksi lisäykseksi määritetään NULL. Tässä tapauksessa strtok-funktio jatkaa jakamista muistetusta osoitteesta. Osiointialgoritmi pysyy samana.

Esimerkki:

Esimerkissä merkkijono "test1/test2/test3/test4" jaetaan osiin käyttämällä erotinta "/" käyttämällä strtok-funktiota. Jaon tulos tulostetaan konsoliin.

Tulos:

Konsolin lähtö:





Yläosa