strtok-toiminnot. C-kielen toimintojen kuvaus. Kuvaus joistakin funktioista merkkijonojen kanssa työskentelemiseen

4 vastausta

Kaksi asiaa, jotka sinun on tiedettävä strtokista. Kuten mainittiin, se "säilyttää sisäisen tilan". Lisäksi hän sotkenut syöttämäsi linjan. Pohjimmiltaan se kirjoittaa "\0", josta se löytää antamasi tunnuksen ja palauttaa osoittimen rivin alkuun. Sisäisesti se säilyttää viimeisen tunnuksen sijainnin; ja seuraavan kerran kun soitat sille, se alkaa sieltä.

Tärkeä seuraus on, että et voi käyttää strtokia merkkijonossa, kuten const char* "hello world"; koska saat käyttöoikeusrikkomuksen, kun muutat const char* -merkkijonon sisältöä.

Strtokin "hyvä puoli" on, että se ei itse asiassa kopioi merkkijonoja, joten sinun ei tarvitse hallita ylimääräistä muistin varausta jne. Mutta jos et ymmärrä yllä olevaa, sinulla on vaikeuksia käyttää sitä.

Esimerkki. Jos sinulla on "this, is, merkkijono", peräkkäiset kutsut strtokiin luovat tämän kaltaisia ​​osoittimia (^-arvo on palautusarvo). Huomaa, että "\0" lisätään kohtaan, jossa tunnisteet löytyvät; tämä tarkoittaa, että alkuperäistä riviä on muutettu:

T h i s , i s , a , s t r i n g \0 this,is,a, merkkijono t h i s \0 i s , a , s t r i n g \0 this ^ t h i s \0 i s \0 r i s \0 a \ 0 s t r i n g \0 a ^ t h i s \0 i s \0 a \ 0 s t r i n g \0 merkkijono ^

Toivottavasti tämä on järkevää.

Strtok()-funktio tallentaa tiedot puheluiden välillä. Se käyttää näitä tietoja, kun kutsut sitä NULL-osoittimella.

Seuraavassa kutsussa käytettävä toiminto tallentaa sisäisen pisteen, jossa viimeinen merkki löydettiin (ei vaadi erityistä kirjaston toteutusta tietovikojen estämiseksi).

strtok ylläpitää sisäistä tilaa. Kun kutsut sitä ei-NULL-merkillä, se alustaa itsensä uudelleen käyttämään antamaasi merkkijonoa. Kun kutsut sitä NULL:lla, se käyttää tätä merkkijonoa ja mitä tahansa muuta tilaa, joka sillä on tällä hetkellä palauttamaan seuraavan tunnuksen.

Strtokin toimintatavasta johtuen sinun on varmistettava, että linkität C-ajoympäristön monisäikeiseen versioon, jos kirjoitat monisäikeistä sovellusta. Tämä varmistaa, että jokainen säie saa oman sisäisen tilansa strtokille.

Strtok-funktio tallentaa tiedot sisäiseen staattiseen muuttujaan, joka jaetaan kaikkien säikeiden kesken.

Kierteiden turvallisuuden vuoksi sinun tulee käyttää strtok_r:ää

Katso staattinen char *last;

Char * strtok(s, delim) register char *s; register const char *delim; (rekisteri char *spanp; register int c, sc; char *tok; staattinen merkki *last; if (s == NULL && (s = last) == NULL) return (NULL); /* * Ohita (span) alku erottimet (s += strspn(s, delim), sort of == sc) goto cont ) if (c == 0) ( /* ei erottelevia merkkejä */ last = NULL; return (NULL); ) tok = s - 1 * Selaa erottimia : s += strcspn(s, delim) * Huomaa, että myös delimissä on oltava yksi NUL. )delim do ( if ((sc = *spanp++) == c) ( if (c == 0) s = NULL; else s[-1] = 0; viimeinen = s; paluu (tok); ) ) while (sc != 0 ) /* NOTREACHED */ )

Jaa

1) Löytää seuraavan merkkijonon nollapäätteisestä tavumerkkijonosta, johon str osoittaa. Erotinmerkit tunnistetaan nollatavumerkkijonosta, johon delim osoittaa.

Tätä funktiota kutsutaan moninkertaiseksi kertomiseksi peräkkäisten merkkien saamiseksi samasta merkkijonosta.

  • Jos str! = NULL str! = NULL , kutsua käsitellään ensimmäisenä strtok-kutsuna kyseiselle riville. Funktio etsii ensimmäistä merkkiä Ei delimissä.
  • Jos tällaista symbolia ei löydy, siinä ei ole merkkejä, ja funktio palauttaa nollaosoittimen.
  • Jos tällainen symboli löydettiin, se tulee olemaan tunnuksen alku. Funktio etsii sitten kyseisestä pisteestä ensimmäistä merkkiä, joka sisältyy delimiin.
    • Jos tällaista merkkiä ei löydy, str:llä on vain yksi merkki, ja tulevat strtok-kutsut palauttavat nollaosoittimen
    • Jos tällainen symboli löytyy, se vaihdettu nollamerkki "\0" ja osoitin seuraavaan merkkiin tallennetaan staattiseen paikkaan myöhempiä kutsuja varten.
  • Funktio palauttaa sitten osoittimen tunnuksen alkuun
  • Jos str == NULL , kutsua käsitellään kuten myöhempiä kutsuja strtok:lle: funktio jatkuu siitä, mihin se jäi edellisessä kutsussa. Käyttäytyminen on sama kuin jos aiemmin tallennettu osoitin välitettiin str .

Käyttäytyminen on määrittelemätön, ellei str tai delim ole osoitin nollapäätteiseen tavumerkkijonoon.

2) Sama kuin (1), paitsi että jokainen vaihe kirjoittaa jäljellä olevien merkkien lukumäärän str:ssä *strmax:iin ja kirjaa tokenisaattorin sisäisen tilan *ptr :ksi. Toistuvien kutsujen (nolla strmax) on läpäistävä strmax ja ptr edellisen kutsun tallentamilla arvoilla. Lisäksi seuraavat virheet kohdataan ajon aikana ja tällä hetkellä asennettu rajoitusten käsittelijätoiminto kutsutaan tallentamatta mitään objektiin, johon ptr osoittaa

  • strmax , delim tai ptr - null osoitin
  • ei-alkuperäisen kutsun tapauksessa (nolla str), *ptr - null-osoitin
  • ensimmäisessä kutsussa *strmax on nolla tai suurempi kuin RSIZE_MAX
  • tunnuksen lopun etsiminen saavuttaa alkuperäisen merkkijonon loppuun (alkuarvolla *strmax mitattuna) ilman nollapäätettä.

Toiminta on määrittelemätön, jos molemmat str osoittaa merkkijonoon, jossa ei ole nollamerkkiä, ja strmax osoittaa arvoon, joka on suurempi kuin kyseisen merkkijonon koko. Kuten kaikki rajoihin liittyvät funktiot, strtok_s on taatusti käytettävissä vain, jos __STDC_LIB_EXT1__ on toteutuksen määrittelemä ja jos käyttäjä määrittää __STDC_WANT_LIB_EXT1__ kokonaislukuvakiolle 1 ennen string.h:n sisällyttämistä.

vaihtoehtoja

Palautusarvo

Palauttaa osoittimen seuraavan tunnuksen alkuun tai NULL, jos merkkejä ei ole enää.

Muistilappu

Tämä funktio on tuhoisa: se kirjoittaa "\0"-merkkejä merkkijonon str elementteihin. Erityisesti merkkijonoliteraalia ei voida käyttää strtok -arvon ensimmäisenä argumenttina.

Jokainen strtok-kutsu muuttaa staattista muuttujaa: se ei ole säikeen turvallinen.

Toisin kuin useimmat muut merkit, strtokin erottimet voivat olla erilaisia ​​jokaiselle myöhemmälle tunnukselle ja ne voivat jopa riippua aiempien merkkien sisällöstä.

Strtok_s-funktio eroaa POSIXin strtok_r-funktiosta siinä, että se on tallennettu tokenoidun merkkijonon ulkopuolelle ja tarkistaa ajonaikaisten rajoitusten varalta.

esimerkki

#define __STDC_WANT_LIB_EXT1__ 1 #sisällytä #sisältää int main(void) ( char input = "Lintu tuli kävellen"; printf("Syötemerkkijonon "%s" jäsentäminen\n", input); char *token = strtok(input, " "); while( token) ( puts(token); token = strtok(NULL, " "); ) printf("Syötemerkkijonon sisältö nyt: ""); for(size_t n = 0; n< sizeof input; ++n) input[n] ? printf("%c", input[n]) : printf("\\0"); puts("""); #ifdef __STDC_LIB_EXT1__ char str = "A bird came down the walk"; rsize_t strmax = sizeof str; const char *delim = " "; char *next_token; printf("Parsing the input string "%s"\n", str); token = strtok_s(str, &strmax, delim, &next_token); while(token) { puts(token); token = strtok_s(NULL, &strmax, delim, &next_token); } printf("Contents of the input string now: ""); for(size_t n = 0; n < sizeof str; ++n) str[n] ? printf("%c", str[n]) : printf("\\0"); puts("""); #endif }

Mahdollinen lähtö:

Syöttömerkkijonon jäsentäminen "Lintu tuli alas kävelemään" Lintu tuli alas kävellen Syöttömerkkijonon sisältö nyt: "A\0lintu\0tuli\0alas\0kävely\0" Syöttömerkkijonon jäsentäminen "Linnu tuli alas Kävele

  • C11 (ISO/IEC 9899:2011):
    • 7.24.5.8 Funktio strtok (s. 369-370)
    • K.3.7.3.1 Funktio strtok_s (s: 620-621)
  • C99 (ISO/IEC 9899:1999):
    • 7.21.5.8 Funktio strtok (s. 332-333)
  • C89/C90 (ISO/IEC 9899:1990):
    • 4.11.5.8 strtok-toiminto
löytää minkä tahansa merkin ensimmäisen sijainnin yhdeltä riviltä, ​​toiselta riviltä
(toiminto)

vain merkit, joita ei löydy toisesta tavumerkkijonosta
(toiminto)
palauttaa suurimman aloitussegmentin pituuden, joka koostuu
vain toisesta tavumerkkijonosta löytyvät merkit
(toiminto)

(C95) (C11)

löytää seuraavan merkkijonon leveästä merkkijonosta
(toiminto)
C++ dokumentaatio varten strtok

Muut alias

strtok

ARVOSTELU

#sisältää

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

Ominaisuuksien testausmakron vaatimukset glibc:lle (katso feature_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() jäsennetty 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 analysoidun merkkijonon merkkien erottimina. 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 tunnuksen lopettamiseksi 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 vierekkä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() kierteiden vaarattomuusvaarallinen (MT-Unsafe race:strtok)
strtok_r() kierteiden vaarattomuusvaaraton (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 identiteetti 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ää erottimen tavun, 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) breakf("%d: %s\n", j, merkki (str2 = tunnus; ; str2 = NULL) ( alitunnus = strtok_r(str2, argv, &saveptr2); if (alitunnus ==); NULL) breakf(" --> %s\n", alitunnus) ) exit(EXIT_SUCCESS)

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

Ohjelmointikielet voivat sisältää erikoistoiminnot merkkijonojen kanssa työskentelemiseen, mikä vapauttaa ohjelmoijan tarpeesta kirjoittaa omia merkkijonojen käsittelytoimintoja. Esimerkiksi sinun on usein määritettävä merkkijonon pituus, ja siksi kielet tarjoavat toiminnon, joka mittaa sen pituuden.

C-ohjelmointikielessä merkkijonojen kanssa työskentelyn funktiot on ilmoitettu otsikkotiedostossa string.h, joka tulee muistaa sisällyttää lähdekoodiin. Merkkien kanssa työskentelemiseen on noin kaksikymmentä funktiota. Niiden joukossa on sellaisia, jotka etsivät merkkijonosta merkkejä, vertailutoimintoja, kopioivat merkkijonoja sekä tarkempia. Luettelo ja kuvaus useimmista olemassa olevista Tämä hetki Toiminnot C-kielellä löytyvät B. Kernighanin, D. Ritchien kirjan "The C Programming Language" liitteestä.

Kaikki string.h:ssa määritellyt funktiot voivat toimintansa aikana muuttaa tai olla muuttamatta yhtä osoittimen välittämää merkkijonoa. Se riippuu toiminnon tarkoituksesta. Useimmat niistä kuitenkin palauttavat jotain: joko osoittimen merkkiin tai kokonaisluvun. Lisäksi, jos funktio muuttaa jotakin parametristaan ​​ja sitä kutsuttiin tätä tarkoitusta varten, sen palauttama voidaan jättää huomiotta (eli sitä ei voi määrittää kutsuvassa funktiossa).

Esimerkiksi strcpy()-funktiolla on seuraava ilmoitus: char *strcpy (char *, const char*) . Se kopioi toisen parametrin osoittaman merkkijonon ensimmäisen parametrin osoittamaan merkkijonoon. Näin ollen ensimmäinen parametri muuttuu. Lisäksi funktio palauttaa osoittimen merkkijonon ensimmäiseen merkkiin:

char s1[10], s2[10]; char * s3; s3 = s2; saa(s1); s3 = strcpy(s2, s1); laittaa (s2) ; laittaa (s3) ; printf("%p, %p \n", s2, s3) ;

Tässä s2 ja s3 osoittavat samaan symboliin (printf() tulostaa samat osoitteet). Kuitenkin, mitä strcpy() palauttaa, sitä ei voida määrittää taulukolle. Tämän toiminnon tulosta ei yleensä sido mihinkään; Joskus riittää, että se yksinkertaisesti muuttaa yhden osoittimen välittämistä merkkijonoista.

Toinen asia on funktiot kuten strlen() tai strcmp() , jotka eivät muuta parametreja, mutta joita kutsutaan tuloksen vuoksi. Strcmp()-funktio vertaa kahta argumenttijonoa kirjain kirjaimelta (leksikografisesti) ja palauttaa 0, -1 tai 1. Esimerkiksi strcmp("boy", "body") kutsuminen palauttaa arvon 1, koska kirjaimen "y" koodi on suurempi kuin kirjaimen "d". Strcmp("body", "boy") kutsuminen palauttaa -1, koska ensimmäinen argumentti on leksikografisesti pienempi kuin toinen.

funktio strtok()

Käyttämällä strtok-toiminnot() voit jakaa merkkijonon erillisiin osiin (tokeneihin). Tämän funktion ilmoitus näyttää tältä: char *strtok (char *, const char *) . Kun funktiota kutsutaan ensimmäisen kerran, ensimmäinen parametri on merkkijono, joka on jaettava. Toinen parametri määrittää erotinmerkkijonon. Saman merkkijonon myöhemmissä funktiokutsuissa ensimmäisen parametrin on oltava NULL, koska toiminto on jo "muistanut", minkä kanssa se toimii. Katsotaanpa esimerkkiä:

char str = "yksi, kaksi, kolme, neljä, viisi" ; char * sp; sp = strtok (str, ", " ) ; while (sp) ( laittaa (sp); sp = strtok (NULL, ", " ) ;)

Tämän koodin suorittamisen seurauksena seuraavat sanat näkyvät näytöllä sarakkeessa:

Yksi kaksi kolme neljä viisi

Kun strtok() kutsutaan ensimmäistä kertaa, osoitin taulukon ensimmäiseen merkkiin ja erotinmerkkijono välitetään funktiolle. Tämän kutsun jälkeen taulukko str muuttuu, siihen jää vain sana "yksi" ja funktio palauttaa myös osoittimen tähän sanaan, joka on määritetty sp:lle.

Vaikka olemme menettäneet loput taulukosta kutsufunktiossa, osoitin muuhun taulukkoon on tallennettu strtok()-kenttään. Kun NULL on hyväksytty, funktio "tietää" toimivan tämän "häntän" kanssa.

Merkkijonojen osien kopiointi

Kun tarvitset vain ketjuttaa kaksi merkkijonoa, ongelma on helppo ratkaista kutsumalla strcat()-funktio, joka liittää toisen ensimmäisen argumentin loppuun. Samanlainen funktio, strncat(), liittää n merkkiä toisesta merkkijonosta ensimmäiseen. n on määritetty kolmanneksi parametriksi.

Entä jos tilanne on monimutkaisempi? Esimerkiksi on kaksi ei-tyhjää riviä, ja sinun on yhdistettävä ensimmäisen alku ja toisen loppu. Tämä voidaan tehdä strcpy()-funktiolla, jos annat viittaukset rivien ensimmäisiin merkkeihin:

char s1[ 20 ] = "Peter Smith" , s2 = "Julia Roberts" ; strcpy (s1+5, s2+5); laittaa (s1) ;

Tässä tapauksessa "Peter Roberts" näkyy näytöllä. Miksi se tapahtui? Osoitin ensimmäisen rivin kuudenteen merkkiin välitettiin strcpy()-funktiolle. Tämä johti siihen, että kopioitaessa tämän rivin merkit ylikirjoitetaan vasta kuudennesta alkaen, koska strcpy() ei "tietä" mitään aikaisemmista merkeistä. Vain osa merkkijonosta välitetään myös toisena argumenttina, joka kopioidaan ensimmäiseen.

Kuinka lisätä yksi rivi toisen keskelle? Voit ratkaista tämän ongelman käyttämällä kolmatta "puskuri" riviä, jossa voit ensin kopioida ensimmäisen rivin, sitten toisen, pyyhkiä ensimmäisen lopun ja liittää sitten ensimmäisen lopun. Mutta voit myös tehdä tämän:

char s1[20] = "yksi kolme" , s2[20] = "kaksi" ; strcpy (s2+3, s1+3); strcpy (s1+4, s2); laittaa (s1) ;

Tässä ensin ensimmäisen loppu kopioidaan toiselle riville, jolloin tuloksena on "kaksi kolme". Sitten toinen rivi kopioidaan ensimmäiselle riville ohittaen sen alun.

Kuvaus joistakin funktioista merkkijonojen kanssa työskentelemiseen

Harjoittele
Alla on kuvauksia joistakin funktioista, jotka suorittavat toimintoja merkkijonoille. Suunnittele ja kirjoita pieniä ohjelmia, jotka havainnollistavat näiden toimintojen toimintaa.

  • char *strchr (const char *, int c) . Palauttaa osoittimen merkin c ensimmäiseen esiintymiseen merkkijonossa. Palauttaa NULL-arvon, jos merkkijonossa ei ole tällaista merkkiä.
  • char *strstr (const char *s2, const char *s1) . Palauttaa osoittimen merkkijonon s1 ensimmäiseen esiintymiseen merkkijonossa s2. Jos osumia ei löydy, palauttaa NULL.
  • char *strncpy (char *, const char *, size_t n) . Kopioi n merkkiä toisesta rivistä ensimmäiseen.
  • size_t strspn (const char *, const char *) . Palauttaa ensimmäisen merkkijonon alun pituuden, joka sisältää merkit, jotka muodostavat toisen merkkijonon.

Kuvaus

Strtok-funktio etsii merkkijonoa merkkijonosta. Tämän funktion kutsusarja jakaa merkkijonon merkkijonoiksi, jotka ovat merkkijonoja, jotka erotetaan erotinmerkeillä.

Ensimmäisessä kutsussa funktio ottaa argumentiksi merkkijonon, jonka ensimmäistä merkkiä käytetään merkkien etsimisen aloituskohtana. Myöhemmissä kutsuissa funktio odottaa nolla-osoitinta ja käyttää sijaintia välittömästi viimeisen tokenin lopun jälkeen uutena skannauspaikkana.

Tunnusmerkin alun määrittämiseksi funktio määrittää ensin merkit, jotka eivät sisälly merkkijonoon delim , eli ne ovat erotinmerkkejä. Ja sitten se tarkistaa loput merkkijonosta merkki kerrallaan ensimmäiseen erotinmerkkiin asti, joka merkitsee tunnuksen loppua.

Tämä perässä oleva merkki korvataan automaattisesti nollamerkillä, ja funktio palauttaa tunnuksen. Tämän jälkeen seuraavat kutsut strtok-funktiolle alkavat tällä nollamerkillä.

Vaihtoehdot:

  • merkkijono
    Merkkijono, josta haetaan lekseemejä. Tämän merkkijonon sisältö muuttuu, se jaetaan pienempiin merkkijonoihin (tokeneihin). Tämä parametri voi sisältäänull-osoitin, jolloin funktio jatkaa skannausta siitä, mihin edellinen onnistunut funktiokutsu jäi.
  • delim
    Merkkijono, joka sisältää erottimet. Ne voivat vaihdella funktiokutsusta toiseen.

Palautusarvo

Osoitin viimeiseen merkkijonosta löytyneeseen merkkiin.
Nolla-osoitin palautetaan, jos merkkejä ei löydy.

Esimerkki: ohjelman lähdekoodi

//esimerkki strtok-funktion käytöstä #include #sisältää int main () ( char str = "Kansallisen kalastuksen piirteet - pitkä elokuva, komedia."; std::cout<< "Разделение строки "" << str << "" на лексемы:n"; char * pch = strtok (str," ,.-"); // во втором параметре указаны разделитель (пробел, запятая, точка, тире) while (pch != NULL) // пока есть лексемы { std::cout << pch << "n"; pch = strtok (NULL, " ,.-"); } return 0; }


Yläosa