Menü
Ingyenes
becsekkolás
a fő  /  Problémák / Strtok S C leírás. MAN STRTOK_R (3): Elemek kivonása (tokenek) a karakterláncból

Strtok S C leírása. MAN STRTOK_R (3): Elemek kivonása (tokenek) a karakterláncból

4 válasz

Két dolog, amit meg kell tudnod Strtokról. Mint említettük, "támogatja a belső állapotot". Ráadásul ő elrontotta az általa táplált karakterláncot. Lényegében, ő fog írni "0", ahol megtalálja a marker szolgáltatott, és visszaadja a mutatót a vonal elejére. Belül, támogatja az utolsó tokeny helyét; És a következő alkalommal, amikor felhívja, ott kezd.

Fontos következmény az, hogy nem használhatsz strzokot a CONSTY * "HELLO WORLD" típusú vonalhoz; Mivel a Const Char * karakterlánc tartalmának megváltoztatásakor hozzáférési jogsértést kap.

A strtok "jó dolog" az, hogy valójában nem másolja a vonalakat, így nem kell ellenőriznie a további memóriaelosztást stb. De ha nem érti a fentieket, problémái lesz annak használatával.

Példa. Ha van "Ez van, van egy karakterlánc", a STTOK soros hívások mutatókat generálnak az alábbiak szerint (az érték ^ a visszatérési érték). Kérjük, vegye figyelembe, hogy a "\\ 0" -t hozzá, ahol a tokenek megtalálhatók; Ez azt jelenti, hogy az eredeti karakterlánc megváltozik:

T az, a, a, string 0, az, a, string ez a \\ 0, a, string \\ 0 Ez ^ ez 0 a 0 a, string \\ 0 jelentése ^ ez \\ 0 0 string \\ 0 a ^ Ez 0 a \\ 0 a \\ 0 karakterlánc \\ 0 karakterlánc ^

Remélem, van értelme.

A Strtok () funkció tárolja az adatokat a hívások között. Ezeket az adatokat használja, ha a null pointer segítségével hívja.

A pont, amelyben az utolsó token megtalálható, egy olyan funkcióval van tárolva, amelyet a következő hívás mellett fognak használni (egy adott könyvtár szükséges az adathibák megelőzéséhez).

a Strtok támogatja a belső állapotot. Ha nem nullával hívja, akkor újra inicializálja magát, hogy használja a szállítandó karakterláncot. Ha Null-val hívja, ezt a sort és bármely más állapotot használja, amely jelenleg a következő tokeneket kapja.

A Strtok működésének köszönhetően meg kell győződnie arról, hogy a C teljesítésének többszálú verziójával csatlakozik, ha írja többszálú alkalmazás. Ez biztosítja, hogy minden szál megkapja saját belső állapotát Strtok számára.

A Strtok funkció az adatokat belső statikus változóban tárolja, amelyet az összes szál között elosztottak.

A biztonság biztonságának biztosítása érdekében strtok_r-t kell használnia

Vessen egy pillantást a statikus karakterre * utolsó;

Char * Strtok (S, DELIM) regisztrálása Char * S; Regisztráljon CONSTRY * DELIM; (Regisztráljon char * spanp; regisztráljon c, sc; char * tok; statikus char * utolsó; ha (s \u003d\u003d null && (s \u003d utolsó) \u003d\u003d null) visszatér (null); / * * Skip (span) vezető Határolók (s + \u003d strspn (S, delim), fajta). * / Cont: c \u003d * s ++; a (spanp \u003d (char *) delim; (sc \u003d * spanp ++)! \u003d 0; (ha (c \u003d\u003d sc) goto cover;), ha (c \u003d\u003d 0) (/ * nem határoló karakterek * / utolsó \u003d , visszatérés (null);) Tok \u003d S - 1; / * * szkennelési token (Scenimiters szkennelése: s + \u003d strcspn (S, DELIM), egyfajta). * Ne feledje, hogy a delimnek egy Nul-nek kell lennie; abbahagyjuk, ha látjuk, hogy is. * / For (;; +, Spanp \u003d (char *) delim; do (ha ((sc \u003d * spanp ++) \u003d\u003d c) \u003d\u003d c) (ha (c \u003d\u003d 0) s \u003d null; más s [-1] \u003d 0; utolsó \u003d s ; Visszatérés (TOK);)) míg (sc! \u003d 0);) / * NotReached * /)

Ossza meg

#Inlude. Char * strtok (char *) sTR1, CONST Char * sTR2.);

A Strtok () függvény visszaadja a mutatót a következő LEX-re a paraméter címzéséhez sTR1. Szimbólumok, amelyek a paraméter által címezhető karakterláncot alkotják sTR2.az osztók, amelyek meghatározzák a lexet. A visszaadandó lexéma hiányában visszatérő nulla mutató.

A C99-es verzióban a paraméterekhez sTR1 és sTR2. Korlátozza a minősítőt.

Ahhoz, hogy megoszthassuk a karakterláncokat a lexemeken, amikor a Strtok funkció először hívja a paramétert sTR1 Ennek a sornak a kezdetére kell mutatnia. A későbbi hívások paraméterként működik sTR1 Nulla mutatót kell használnia. Így az egész vonal lebontja a lexemeseket.

Minden alkalommal, amikor kapcsolatba lép a Strtok () funkcióval, használhat különböző szeparátorkészleteket.

Példa

Ez a program megszakítja a "Grass Green, a nap ragyog" karakterláncát a lexemeken, amelyek elválasztók szolgálnak szóközöket és vesszőket. Ennek eredményeként kiderül

Hestern | Green | Sun | Blusters #include #Inlude. Int Main (Void) (char * p, p \u003d strtok ("zöld fű, ragyog", ""); nyomtatás (p); do (p \u003d strtok ("\\ 0", ","); ha (p) Printf ("|% s", p);) míg (p); 0;)

Szintaxis:

#Inlude.
char * strtok (char * str, const char * sep);

Arguments:

str egy mutató egy törött karakterlánc.
A SEP egy mutató a szeparátor karakterkészletét tartalmazó karakterlánchoz.

Visszatérési érték:

NULL - Ha a string str-ot nem lehet alkatrészekre osztani.
Mutató a vonal kiválasztott részének első karakteréhez.

Leírás:

A strtok funkció kiemeli a vonal következő részét, amelyhez az STR argumentumot elválasztják a szeparátorok egyik karakterétől, amelyre a SEP argumentum jelzi. A Strtok funkció soros hívása a sztring karakterlánc lebontásához vezet (Lexemes).

"Amikor először hívja a Strtok funkciót, a megosztott karakterlánc (STR) kezdete és a szeparátorok (SEP) kezdete (SEP) meg van adva. Kezdetben a Strtok funkció felváltva megnézi a karakterlánc karakterláncokat, és olyan szimbólumot keres, amely nem szerepel a SEP szeparátorok karakterláncában. Ha a string string, string vége jel észlelése korábbi, mint a szimbólum nem szerepel a szeptember húr, lehetetlen, hogy osztja a húr STR részéről, a nulla mutató (NULL) adja vissza. Ha ilyen szimbólum megtalálható, akkor a string string első részének kezdete. "

Ezután a Strtok funkció egy szeparátort keres, vagyis a SEP karakterláncban szereplő szimbólum. Ha ilyen szimbólum nem található, úgy véljük, hogy a string str egy részből áll, és a string karakterlánc következő elválasztása visszaadja a nulla mutatót. Ha ilyen szimbólum található. Ez helyett egy nulla szimbólum (a vonal szimbólum vége). Ezután a Strtok funkció emlékszik az aktuális pozícióra (a mutató a karakter, amelyből a sor keresése a sor a következő része megkezdődik), és visszaadja a mutatót a vonal első kiválasztott részének elejére.

Ha a Strtok funkció nem nulla mutatót adott vissza, akkor folytathatja a részleges karakterlánc partícióját. A vonal megosztása érdekében a Strtok funkciót újra hívják, de a törött vonal mutatója helyett a null az első növelésként van megadva. Ebben az esetben a Strtok funkció továbbra is megszakad a memorizált címből. A partíció algoritmusa ugyanaz marad.

Példa:

A példában a "Test1 / Test2 / Test3 / Test4" vonal a "/" elválasztó részeire osztható a Strtok funkcióval. A partíció eredménye megjelenik a konzolon.

Eredmény:

Következtetés a konzolban:


char * Far _fsttok (CONSTRY FAR * STR1, CONSTRY FAR * STR2)

Leírás:

A Strtok () függvény egy mutatót ad vissza a következő LEX-hez, amelyre az STR1 jelzi. A karakterláncból származó szimbólumok, amelyekre az STR2 jelzi a Lex meghatározó korlátozóit. Ha a lexema nem található, null visszaküld.

A Strtok () funkció első hívása során az STR1-et ténylegesen mutatják. A későbbi kihívásokkal az első érvként nullot használnak. Így az egész karakterlánc megszakadhat a lexemeken.

Fontos megérteni, hogy a Strtok () függvény módosítja azt a karakterláncot, amelyre az STR1 jelzi. Minden alkalommal, amikor Lexeme találtak, a helyszínen, ahol a limitert találtak, nulla szimbólum van elhelyezve. Így a strtok () a karakterlánc mentén mozog.

Minden alkalommal, amikor a Strtok () hívás, akkor változhat a korlátozó készlet.

A _fstrtok () függvény a szóban forgó funkció távoli verziója.

Az alábbi program eltörik a "The Summer Solidier, The Sunshine Patriot" string segítségével terek és a vesszőt limitálókként. A program eredményeként a program a következő típusú vonalat alkotja: "A | Nyári | Katona | A | Napsütés | Hazafi. "
#Inlude.
#Inlude.
iNT fő (üresség)
{
char * p;
P \u003d strtok ( "A nyári katona, a napsütés hazafi", " " ) ;
printf (P);
(
P \u003d strtok (" \0 " , ", " ) ;
ha (p) printf ("|% s", p);
) Míg (p);
vissza 0;
}

Más álnevek.

Strtok.

ÁTTEKINTÉS

#Inlude.

char * strtok (char *)str., CONST Char *dELIM.);
char * strtok_r (char *str., CONST Char *dELIM., char **saveptr.);

A GLIBC-re vonatkozó makró követelmények (lásd feature_test_macros.(7)):

strtok_r.(): _Svid_source || _BSD_SOURCE || _Posix_c_source\u003e \u003d 1 || _Xopen_source || _Posix_source.

LEÍRÁS

Funkció strtok.() elválasztja a karakterláncot nulla vagy több, nem üres tokenszekvenciára. Az első hívás alatt strtok.() Az elemzett karakterláncot az érvelésben kell megadni. str.. Minden további hívásban, amely elemzi ugyanazt a karakterláncot, értéket str. Nullnak kell lennie.

Érvben dELIM. A bájtok sorozata van beállítva, amelyek a sorban elemzett sorban lévő token elválasztóknak tekintendők. A hívó különböző vonalakat jelezhet dELIM. Az ugyanazon karakterlánc elemzésénél későbbi kihívásokban.

Minden hívás strtok.() Visszatér egy mutatót egy null-val végződő karakterláncra, amely a következő token tartalmazza. Ez a vonal nem tartalmazza a byte elválasztót. Ha nincs több token, akkor strtok.() Visszaadja null.

Hívásszekvencia strtok.(), A működési egy sort, támogatja egy mutatót, amely meghatározza azt a pontot, ahonnan a keresést a következő token kezdődik. Első kihívás strtok.() Nevezi ezt a mutatót az első bájtvonalra. A következő token elejét a keresés határozza meg str. A következő byte nem szeparátor. Ha a byte megtalálható, akkor a következő token kezdete. Ha ilyen bájt nem található, nincs több token és strtok.() NULL (üres karakterlánc esetén, vagy ebben az esetben csak szeparátorokból áll, null visszatér, ha az első hívás strtok.()).

Az egyes tokeny vége az előre, amely a byte-szeparátor megtalálható, vagy a végső byte null ("\\ 0"). Ha a byte-szeparátor megtalálható, akkor egy null byte váltja fel az aktuális tokeneket, és strtok.() A következő bájtra mutató mutatót; Ez a mutató kezdeti pontként fogja használni, amikor a következő token keresése. Ebben az esetben strtok.() Visszaadja a mutatót a talált tokeny elejére.

A fenti leírásból következik, hogy a nézetben megtekintett két vagy több folyamatos elválasztó bájt szekvenciáját egy elválasztónak tekintik, és az osztók bájtokat a sor elején vagy végén figyelmen kívül hagyják. Más szóval, tokenek visszatértek strtok.() - Mindig ne üres vonalak. Vagyis például, ha van egy karakterlánc " aAA ;; BBB,", Aztán későbbi kihívások strtok.() meghatározott vonalosztókkal ;, "Visszaadná a vonalakat" aAA."És" bBB.-, majd a null mutató.

Funkció strtok_r.() egy újratölthető változat strtok.(). Érv saveptr. egy mutató a változóhoz char *Használt belsejében strtok_r.() A későbbi kihívások közötti összefüggésnek az azonos vonal elemzésénél.

Az első hívás alatt strtok_r.() Érték str. meg kell jelölnie az elemzett karakterláncot és az értéket saveptr. figyelmen kívül hagyja. Azután hívja az értéket str. Nullnak kell lennie, és az érték saveptr. az előző hívás pillanatától nem kell változtatnia.

Ugyanakkor különböző sorokat lehet elemezni több elindításkor. strtok_r.() különböző érvekkel saveptr..

Visszatérési érték

Funkciók strtok.() I. strtok_r.() Visszaadja a mutatót a következő token vagy , ha nincs több token.

Tulajdonságok

A szakasz feltételeinek leírása, lásd: attribútumok.(7).
Felület Tulajdonság Érték
strtok.() győződjön meg róla, hogy a szálakbizonytalan (Mt-Unafe Race: Strtok)
strtok_r.() győződjön meg róla, hogy a szálakártalmatlan (MT-SAFE)

Megfelelés

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

Hibák

Használja ezeket a funkciókat óvatosan. Figyelembe véve, hogy: * Ezek a funkciók megváltoztatják az első érvüket. * Ezek a funkciók nem használhatók állandó húrokkal. * A bájt elválasztó személyazonossága elveszett. * A funkció elemzése során strtok.() A statikus puffert használ, így a szálak nem biztonságosak. Használat strtok_r.() ebben az esetben.

PÉLDA

Az alábbiakban bemutatott program a beágyazott ciklusokat használja strtok_r.() A karakterláncok tokenek összetevőinek megosztása. Az első paraméterben parancs sor Az elemzett karakterlánc be van állítva. A második paraméterben a byte (S) egy elválasztó, amely a karakterlánc "kompozit" tokenekre osztható. A harmadik paraméter a bájtokat jelzi - a szeparátor, amelyet a termékeny "kompozit" tokenek elkülönítésére használnak.

Példa a program kimenetének eredményeire:

$ ./a.out "A / BBB // CC; XXX: YYY:" ":;" "/" 1: A / BBB // CC -\u003e A -\u003e BBB -\u003e CC 2: XXX -\u003e XXX 3: YYY -\u003e YYY

Forráskód program

#Inlude. #Inlude. #Inlude. Int Main (INT ARGC, CHAR * ARGV) (CHAN * STR1, * STR2, * Token, * subtoken; char * saveptr1, * Saveptr2, Int J; ha (ArgC! \u003d 4) (Frintf (Stderr, "Használat:% S string delim subdelim \\ n ", argv); kilépés (exit_failure);) mert (j \u003d 1, str1 \u003d argv ;; j ++, str1 \u003d null) (token \u003d strtok_r (STR1, argv, és savt1); ha (token \u003d \u003d null) szünet; nyomtatás ("% d:% s \\ n", j, token); mert (str2 \u003d token ;; str2 \u003d null) (subtoken \u003d strtok_r (STR2, argv, és saveptr2); ha (subtoken \u003d\u003d null) szünet; nyomtatás ("-\u003e% s \\ n", subtoken);))) Kilépés (Exit_Success);)

Egy másik példa egy olyan programra, amely felhasználja strtok.() megtalálható getaddrinfo_a.(3).