Meny
Är gratis
checka in
den huvudsakliga  /  Problem / Sttok s c Beskrivning. Man Strtok_r (3): Extraktion av element (tokens) från strängen

Strtok s c Beskrivning. Man Strtok_r (3): Extraktion av element (tokens) från strängen

4 svar

Två saker du behöver veta om Sttok. Som nämnts, stöder han det inre tillståndet. " Dessutom, han bortskämda strängen som du matar den. I huvudsak kommer han att skriva "\\ 0", där han hittar den markör som du har lämnat, och kommer tillbaka pekaren till början av linjen. Internt stöder den platsen för den sista tokeny; Och nästa gång du kallar det, börjar han därifrån.

En viktig konsekvens är att du inte kan använda Sttok för en Line Type Const Char * "Hello World"; Eftersom du får tillgång till överträdelse vid byte av innehållet i Const Char * -strängen.

Den "bra sak" i Sttok är att det i själva verket inte kopierar linjerna, så du behöver inte styra den extra minnesallokeringen etc. Men om du inte förstår det ovanstående, kommer du att ha problem med användningen.

Exempel. Om du har "det här är en sträng", kommer seriella samtal Strtok att generera pekare enligt följande (värde ^ är returvärdet). Observera att "\\ 0" läggs till, där tokens finns Det betyder att den ursprungliga strängen ändras:

T hans, är, en, sträng \\ 0 det här är, en, sträng Denna \\ 0 är, a, sträng \\ 0. ^ Det här \\ 0 är \\ 0 a, sträng \\ 0 är ^ det här \\ 0 är \\ 0 a \\ 0 String \\ 0 A ^ Den här \\ 0 är \\ 0 A \\ 0 String \\ 0 String ^

Hoppas det är vettigt.

Funktionen Sttok () lagrar data mellan samtal. Den använder dessa data när du ringer den med nollpekaren.

Den punkt där den senaste token hittades lagras inuti med en funktion som kommer att användas bredvid följande samtal (ett specifikt bibliotek krävs för att förhindra datafel).

strtok stöder internt tillstånd. När du ringer det med non-, initierar det dig själv att använda den sträng du levererar. När du kallar den med null använder den den här raden och något annat tillstånd som det för närvarande får returnera följande tokens.

På grund av hur STRTOK fungerar måste du se till att du ansluter till en mångsidig version av C-uppföljning om du skriver multi-threaded application. Detta säkerställer att varje tråd kommer att få sitt eget interna tillstånd för STRTOK.

Strtok-funktion lagrar data i en intern statisk variabel, som distribueras mellan alla trådar.

För att säkerställa säkerhetssäkerhet måste du använda Sttok_r

Ta en titt på statisk char * sist;

Char * Strtok (s, delim) Registrera Char * s; Registrera Const Char * Delim; (Registrera Char * Spänning; Registrera Int c, sc; char * tok; statisk char * sista; om (s \u003d\u003d null && (s \u003d sista) \u003d\u003d null) retur (null); / * * hoppa över (span) Avgränsare (s + \u003d strsspn (s, delim), sorts). * / Cont: c \u003d * s ++; för (spanp \u003d (char *) delim; (sc \u003d * spanp ++)! \u003d 0;) (om (c \u003d\u003d sc) goto cont;) om (c \u003d\u003d 0) (/ * inga icke-avgränsiga tecken * / sista \u003d null; retur (null);) tok \u003d s - 1; / * * Skanna token (Skanna efter avgränsare: S + \u003d Strcspn (s, delim), sorts). * Observera att delim måste ha en nul; vi slutar om vi ser det också. * / För (;;) (c \u003d * s + +; Spanp \u003d (char *) delim; gör (om ((sc \u003d * spanp ++) \u003d\u003d c) (om (c \u003d\u003d 0) s \u003d null; annars s [-1] \u003d 0; sista \u003d s ; Retur (Tok);)) medan (SC! \u003d 0);) / * Notreached * /)

Dela med sig

#Omfatta. Char * Sttok (Char * strl, Const char * sTR2.);

Funktionen Sttok () returnerar pekaren till nästa lex i strängen som adresserar parametern strl. Symboler som bildar en sträng adressbar av parametern sTR2.är dividers som definierar en lex. I avsaknad av en lexem som ska returneras returneras en nollpekare.

I C99-versionen till parametrarna strl och sTR2. Begränsa kvalifikatorn tillämpas.

Att dela upp en sträng på lexemerna, när Strtok-funktionen först kallar parametern strl Måste peka på början av denna linje. Vid efterföljande samtal fungerar som en parameter strl Du måste använda en nollpekare. På så sätt är hela linjen uppdelad på lexemerna.

Varje gång du kontaktar funktionen Sttok () kan du använda olika uppsättningar av separatorer.

Exempel

Det här programmet bryter strängen "The Grass Green, solen skiner" på de lexemes vars separatorer serverar utrymmen och kommatecken. Som ett resultat visar det sig

Hestereern | grön | sol | blusters #include #Omfatta. Int huvud (tomrum) (char * p; p \u003d strtok ("grönt gräs, skina", ""); printf (p); gör (p \u003d strtok ("\\ 0", ","); om (p) Printf ("|% s", p);) medan (p) returnera 0;)

Syntax:

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

Argument:

sTR är en pekare till en trasig sträng.
Sep är en pekare till en sträng som innehåller en uppsättning separatorkaraktärer.

Returvärde:

Null - om strängen Str inte kan delas in i delar.
Pekare till den första karaktären hos den valda delen av linjen.

Beskrivning:

Strtok-funktionen lyfter fram nästa del av den linje som Str-argumentet är separerat från en av de separatorer som anges i den sträng som SEP-argumentet indikerar. Seriella samtalet för STRTOK-funktionen leder till nedbrytningen av strängsträngen på delen (lexemes).

"När du först kallar Strtok-funktionen, anges starten på den delade strängen (STR) och början av en stränginnehållande separatorer (sep). I början visar STRTOK-funktionen växelvis strängsträngssträngen och söker efter en symbol som inte finns i SEP-separatorsträngen. Om i strängsträngen uppstår strängändsymbolen tidigare än symbolen inte ingår i SEP-strängen, det är omöjligt att dela strängen av STR på den del, nollpekaren (null) returneras. Om en sådan symbol hittas anses den i början av den första delen av strängen Str. "

Därefter söker Sttok-funktionen en separator, det vill säga en symbol som ingår i SEP-strängen. Om en sådan symbol inte hittas antas det att strängen STR består av en del och den efterföljande separationen av strängsträngen kommer att returnera nollpekaren. Om en sådan symbol hittas. Den ersätts med en nollsymbol (slutet av linjesymbolen). Därefter minns STRTOK-funktionen den aktuella positionen (pekaren till tecknet från vilken sökningen efter nästa del av linjen börjar) och returnerar pekaren till början av den första valda delen av linjen.

Om STRTOK-funktionen returnerade en icke-nollpekare kan du fortsätta partitionen av strängsträngen på den del. För att fortsätta splittra linjen återkallas STRTOK-funktionen, men istället för pekaren till den trasiga linjen anges null som den första förstärkningen. I det här fallet fortsätter ARPTOK-funktionen att bryta från den memorerade adressen. Algoritmen för partitionen kommer att förbli densamma.

Exempel:

I exemplet är "TEST1 / TEST2 / TEST3 / TEST4" -linjen uppdelad i delar av "/" -avskiljaren med hjälp av STRTOK-funktionen. Resultatet av partitionen visas på konsolen.

Resultat:

Slutsats i konsolen:


char långt * långt _fstrtok (const char långt * str1, const char långt * str2)

Beskrivning:

Funktionen Sttok () returnerar en pekare till nästa lex i strängen till vilken STR1 indikerar. Symboler från strängen till vilken STR2 indikerar används som begränsare som bestämmer lexen. Om Lexema inte hittas returneras null.

Under det första samtalet av Sttok () -funktionen används Str1 faktiskt som en pekare. Med efterföljande utmaningar används null som det första argumentet. Således kan hela strängen brytas på lexemerna.

Det är viktigt att förstå att funktionen Sttok () ändrar den sträng som STR1 indikerar. Varje gång en lexem hittades, på den plats där begränsaren hittades, placeras en nollsymbol. Således rör sig STRTOK () längs strängen.

Varje gång Strtok () -samtalet kan du variera den uppsättning gränserna.

Funktionen _FSTRTOK () är den fjärra versionen av den aktuella funktionen.

Följande program bryter "The Summer Solidier, Sunshine Patriot" -strängen med hjälp av mellanslag och kommatecken som begränsare. Som ett resultat av programmet kommer programmet att bildas linjen av följande typ: "The | Sommar | Soldat | The | Solsken | Patriot. "
#Omfatta.
#Omfatta.
int huvud (tomrum)
{
char * p;
P \u003d Strtok ( "Sommaroldaten, Sunshine Patriot", " " ) ;
printf (p);
göra (
P \u003d Strtok (" \0 " , ", " ) ;
om (p) printf ("|% s", p);
) Medan (p);
returnera 0;
}

Annat alias.

Strtok.

ÖVERSIKT

#Omfatta.

char * Sttok (Char *str., Const char *delim.);
char * Sttok_r (Char *str., Const char *delim., Char **savePtr.);

Fastighetsprovning Makrobehov för GLIBC (se feature_test_macros.(7)):

strtok_r.(): _SVID_Source || _Bsd_source || _Posix_c_source\u003e \u003d 1 || _Xopen_source || _Posix_source.

BESKRIVNING

Fungera strtok.() separerar strängen till en sekvens av noll eller mer icke-tomma tokens. Under det första samtalet strtok.() Den analyserade strängen måste anges i argumentet. str.. I varje efterföljande samtal, som analyserar samma sträng, värde str. Det måste finnas null.

I argument delim. En uppsättning byte är inställd, som betraktas som betecknade separatorer i den analyserade raden. Den som ringer kan indikera olika linjer i delim. I efterföljande utmaningar vid analys av samma sträng.

Varje samtal strtok.() Returnerar en pekare till en sträng som slutar med , som innehåller följande token. Denna linje inkluderar inte byte separator. Om det inte finns några fler tokens, då strtok.() Returnerar null.

Samtalsekvens strtok.(), operativ en rad, stöder en pekare som bestämmer den punkt från vilken sökningen efter nästa token börjar. Första utmaningen strtok.() Utser den här pekaren till den första byte-linjen. Början av nästa token bestäms av sökningen framåt i str. Nästa byte är inte separator. Om byte finns, tas den som början på nästa token. Om en sådan byte inte hittas finns det inga fler tokens och strtok.() Returnerar null (för en tom sträng eller består endast av separatorer i det här fallet, kommer null att återvända när det första samtalet strtok.()).

Slutet på varje tokeny är en sökning efter framåt, som hittas tills byte-separatorn hittas eller den sista byte null ("\\ 0"). Om byte-separatorn hittas, ersätts den med en null byte för att slutföra de aktuella tokenserna, och strtok.() Håller en pekare till nästa byte; Denna pekare kommer att användas som en första punkt när du söker efter nästa token. I detta fall strtok.() Returnerar pekaren till början av de befogade.

Från beskrivningen ovan följer att sekvensen av två eller flera kontinuerliga separatorer byte i sikten betraktas som en separator, och delarna byte i början eller slutet av raden ignoreras. Med andra ord återvände tokens strtok.() - alltid inte tomma linjer. Det är till exempel om det finns en sträng " aAA ;; BBB,", Då efterföljande utmaningar strtok.() med angivna linjers uppdelare ;, "Skulle återvända linjerna" aaa"Och" bBB.", Och sedan nollpekaren.

Fungera strtok_r.() är en reentersfull version strtok.(). Argument savePtr. är en pekare till variabeln char *används inuti strtok_r.() Att redovisa sammanhanget mellan efterföljande utmaningar vid analys av samma linje.

Under det första samtalet strtok_r.() Värde str. bör ange den analyserade strängen och värdet savePtr. ignoreras. Vid efterföljande samtal är värdet str. Det måste finnas , och värdet savePtr. bör inte ändras från det föregående samtalet.

Samtidigt kan olika linjer analyseras vid flera lanseringar. strtok_r.() med olika argument savePtr..

Returvärde

Funktioner strtok.() I. strtok_r.() Returnera pekaren till nästa token eller , om det inte finns några fler tokens.

Attribut

Beskrivning av villkoren i det här avsnittet, se attribut.(7).
Gränssnitt Attribut Värde
strtok.() se till i trådarnaosäker (MT-osäker tävling: Strtok)
strtok_r.() se till i trådarnaofarlig (mt-säker)

Efterlevnad

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

Defekter

Använd dessa funktioner med försiktighet. Ta hänsyn till att: * Dessa funktioner ändrar sitt första argument. * Dessa funktioner kan inte användas med konstanta strängar. * Byteparatorns identitet förloras. * Vid analys av funktionen strtok.() Använder statisk buffert, så det är inte säkert för trådarna. Använda sig av strtok_r.() I detta fall.

EXEMPEL

Programmet som presenteras nedan använder nestade cykler som orsakar strtok_r.() För att dela strängen till komponenterna i dess tokens. I den första parametern kommandorad Den analyserade strängen är inställd. I den andra parametern är byte (erna) en separator som används för att dela strängen till "komposit" tokens. Den tredje parametern indikerar byte (er) - separatorn, som används för att separera "komposit" tokens på den bördiga.

Exempel på resultaten av programmets utgång:

$ ./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

Källkodsprogram

#Omfatta. #Omfatta. #Omfatta. INT MAIN (INT ARGC, CHAR * ARGV) (CHAR * STR1, * STR2, * Token, * subtoken; Char * SavePtr1, * SPAREPTR2; INT J; Om (Argc! \u003d 4) (FPRINTF (STDERR, "ANVÄNDNING:% s sträng delim subdelim \\ n ", argv); Avsluta (exit_failure);) för (j \u003d 1, str1 \u003d argv ;; j ++, str1 \u003d null) (token \u003d strtok_r (str1, argv, & savePtr1); om (token \u003d \u003d null) paus; printf ("% d:% s \\ n", j, token); för (str2 \u003d token ;; str2 \u003d null) (subtoken \u003d strtok_r (str2, argv, & savePtr2); om (subtengen \u003d\u003d null) paus; printf ("-\u003e% s \\ n", subtoken);)) Avsluta (exit_success);)

Ett annat exempel på ett program som använder strtok.() finns i getaddrinfo_a.(3).