strtok funkcijas. Kā strtok funkcija darbojas valodā C? Piemērs: programmas pirmkods

Cits aizstājvārds

strtok

APSKATS

#iekļauts

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

Prasības rekvizītu pārbaudes makro glibc (sk funkciju_testa_makro(7)):

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

APRAKSTS

Funkcija strtok() sadala virkni nulles vai vairāku netukšu marķieru secībā. Pirmajā zvanā strtok() argumentā jānorāda parsētā virkne str. Katrā nākamajā izsaukumā, kas parsē to pašu virkni, vērtību str jābūt NULL.

Argumentā delim ir norādīta baitu kopa, kas tiek uzskatīta par marķieru atdalītājiem analizētajā virknē. Zvanītājs var norādīt dažādas līnijas delim nākamajos izsaukumos, parsējot to pašu virkni.

Katrs zvans strtok() atgriež rādītāju uz nulles gala virkni, kas satur nākamo marķieri. Šajā rindā nav iekļauts norobežotāja baits. Ja žetonu vairs nav, tad strtok() atgriež NULL.

Zvanu secība strtok(), kas darbojas ar vienu virkni, uztur rādītāju, kas norāda punktu, kurā sākas nākamā marķiera meklēšana. Pirmais zvans strtok() piešķir šim rādītājam atsauci uz virknes pirmo baitu. Nākamā marķiera sākums tiek noteikts, meklējot uz priekšu iekšā str nākamais baits nav atdalītājs. Ja tiek atrasts baits, tas tiek uzskatīts par nākamā marķiera sākumu. Ja šāds baits netiek atrasts, tad vairs nav marķieru un strtok() atgriež NULL (tukšai vai norobežotai virknei, tādā gadījumā NULL tiks atgriezta pirmajā izsaukšanas reizē strtok()).

Katra marķiera beigas tiek atrastas, meklējot uz priekšu, līdz tiek atrasts norobežotāja baits vai beigu nulles baits ("\0"). Ja tiek atrasts norobežotāja baits, tas tiek aizstāts ar nulles baitu, lai pārtrauktu pašreizējo marķieri, un strtok() saglabā rādītāju uz nākamo baitu; šis rādītājs tiks izmantots kā sākumpunkts, meklējot nākamo marķieri. Šajā gadījumā strtok() atgriež rādītāju uz atrastā marķiera sākumu.

No iepriekš minētā apraksta izriet, ka divu vai vairāku blakus esošu norobežotāju baitu secība skenētajā rindā tiek uzskatīta par vienu norobežotāju, un norobežotāja baiti virknes sākumā vai beigās tiek ignorēti. Citiem vārdiem sakot, žetoni atgriezās strtok() - vienmēr nav tukšas virknes. Tas ir, piemēram, ja ir rinda " aaa;;bbb,", pēc tam nākamie zvani strtok() ar dotajiem rindu atdalītājiem " ;, "atgrieztu stīgas" aaa" Un " bbb" un pēc tam nulles rādītājs.

Funkcija strtok_r() ir atkārtoti ienācēja versija strtok(). Arguments saveptr ir rādītājs uz mainīgo char* kas tiek lietots iekšēji strtok_r(), lai, analizējot vienu un to pašu virkni, ņemtu vērā kontekstu starp nākamajiem izsaukumiem.

Pirmajā zvanā strtok_r() nozīme str jānorāda uz parsējamo virkni un vērtību saveptr ignorēts. Turpmākajos zvanos vērtība str ir jābūt NULL un vērtībai saveptr nevajadzētu mainīties kopš iepriekšējā zvana.

Dažādas rindas var analizēt vienlaicīgi vairākos palaijumos strtok_r() ar dažādiem argumentiem saveptr.

ATGRIEŠANAS VĒRTĪBA

Funkcijas strtok() Un strtok_r() atgriezt rādītāju uz nākamo marķieri vai NULL, ja vairs nav marķieru.

ATRIBŪTI

Šīs sadaļas terminu aprakstu sk atribūti(7).
Interfeiss Atribūts Nozīme
strtok() nekaitīgums pavedienosnedrošas (MT-Nedrošas sacīkstes:strtok)
strtok_r() nekaitīgums pavedienosnekaitīgs (MT-Safe)

ATBILSTĪBA

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

Defekti

Izmantojiet šīs funkcijas piesardzīgi. Lūdzu, ņemiet vērā, ka: * Šīs funkcijas maina savu pirmo argumentu. * Šīs funkcijas nevar izmantot ar nemainīgām virknēm. * Atdalītāja baita identitāte ir zaudēta. * Analizējot funkciju strtok() izmanto statisku buferi un tāpēc nav vītnes drošs. Izmantot strtok_r() šajā gadījumā.

PIEMĒRS

Tālāk norādītajā programmā izsaukšanai tiek izmantotas ligzdotas cilpas strtok_r(), lai sadalītu virkni to veidojošos marķieros. Pirmajā parametrā komandrinda ir norādīta analizējamā virkne. Otrais parametrs norāda atdalīšanas baitu(-us), kas tiek izmantots, lai sadalītu virkni “saliktos” marķieros. Trešais parametrs norāda atdalīšanas baitu(-us), kas tiek izmantots, lai sadalītu “saliktos” marķierus apakštokenos.

Programmas izvades piemērs:

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

Programmas pirmkods

#iekļauts #iekļauts #iekļauts int main(int argc, char *argv) ( char *str1, *str2, *token, *subtoken; char *saveptr1, *saveptr2; int j; if (argc != 4) ( fprintf(stderr, "Lietojums: % s string delim subdelim\n", argv); iziet (EXIT_FAILURE); ) for (j = 1, str1 = argv; ; j++, str1 = NULL) ( marķieris = strtok_r(str1, argv, &saveptr1); if (token = = NULL) breakf("%d: %s\n", j, marķieris (str2 = marķieris; ; str2 = NULL) ( apakštokens = strtok_r(str2, argv, &saveptr2); if (apakštokens ==); NULL) pārtraukums printf(" --> %s\n", apakštokens) ) iziet(EXIT_SUCCESS)

Vēl viens programmas piemērs strtok(), var atrast getaddrinfo_a(3).

Funkcija strtok() atgriež rādītāju uz nākamo marķieri virknē, uz kuru norāda str1. Rakstzīmes, kas veido str2 adresēto virkni, ir atdalītāji, kas nosaka marķieri. Ja nav atgriešanas marķiera, tiek atgriezts nulles rādītājs.

Versijā C99 ierobežojošais kvalifikators tiek piemērots parametriem str1 un str2.

Lai sadalītu virkni marķieros, pirmo reizi izsaucot strtok(), parametram str1 jānorāda uz virknes sākumu. Turpmākajos funkcijas izsaukumos kā str1 parametrs ir jāizmanto nulles rādītājs. Šajā gadījumā visa virkne tiks mainīta katru reizi, kad funkcija tiek izsaukta.

Katrs funkcijas strtok() izsaukums var izmantot atšķirīgu marķiera atdalītāju kopu.

Funkcija strtok () nodrošina līdzekli virknes samazināšanai līdz tās sastāvdaļām. Piemēram, šī programma marķieri virkni "Viens, divi un trīs".

#iekļauts #iekļauts int main(void) char *p; p = strtok("Viens, divi un trīs.", ","); printf(p); do ( p = strtok(NULL, ",. "); if(p) printf("|%s", p); ) while(p), atgriež 0; )

Šīs programmas rezultāts ir šāds.

Viens | divi | un | trīs

Ievērojiet, kā strtok funkcija() vispirms tiek izsaukts ar sākotnējo virkni, bet turpmākajos tā izsaukumos kā pirmais arguments tiek izmantots NULL. Funkcija strtok() uztur iekšējo rādītāju uz apstrādājamo virkni. Ja pirmais strtok() arguments norāda uz virkni, iekšējais rādītājs tiek iestatīts uz šīs virknes sākumu. Ja pirmais arguments ir NULL, strtok() turpina iepriekšējās virknes apstrādi, sākot no iepriekšējā solī apgūtās pozīcijas, un virza iekšējo rādītāju uz priekšu, kad tiek izgūts nākamais marķieris. Tādējādi funkcija strtok() "šķērso" visu virkni. Ņemiet vērā arī to, kā mainās norobežotāja virkne pirmajā un turpmākajos funkcijas izsaukumos. Katram zvanam norobežotājus var definēt atšķirīgi.

#iekļauts char *strtok(char * str1, const char * str2);

Funkcija strtok() atgriež rādītāju uz nākamo marķieri virknē, uz kuru attiecas parametrs str1. Rakstzīmes, kas veido parametra adresēto virkni str2, ir norobežotāji, kas definē marķieri. Ja nav atgriešanas marķiera, tiek atgriezts nulles rādītājs.

Versijā C99 uz parametriem str1 Un str2 Tiek piemērots ierobežojuma kvalifikators.

Lai sadalītu virkni marķieros, pirmo reizi izsaucot parametru strtok(). str1 jānorāda uz šīs rindas sākumu. Turpmākajos izsaukumos uz funkciju kā parametru str1 jums ir jāizmanto nulles rādītājs. Tādā veidā visa virkne tiek sadalīta marķieros.

Katrs funkcijas strtok() izsaukums var izmantot atšķirīgu norobežotāju kopu.

Piemērs

Šī programma sadala virkni “Zāle zaļa, saule spīd” žetonos, kas atdalīti ar atstarpēm un komatiem. Rezultāts būs

Zāle|kļūst zaļa|saule|mirdz #iekļauts #iekļauts int main(void) ( char *p; p = strtok("Zāle ir zaļa, saule spīd", " "); printf(p); do ( p = strtok("\0", ", ") if(p ) printf("|%s", p);

Sintakse:

#iekļauts
char *strtok(char *str, const char *sep);

Argumenti:

str – rādītājs uz sadalāmo virkni.
sep – rādītājs uz virkni, kurā ir norobežojošo rakstzīmju kopa.

Atgriešanas vērtība:

NULL – ja virkni str nevar sadalīt daļās.
Rādītājs uz atlasītās virknes daļas pirmo rakstzīmi.

Apraksts:

Funkcija strtok atlasa nākamo virknes daļu, uz kuru norāda arguments str, atdalot to ar vienu no norobežojošām rakstzīmēm, kas norādītas virknē, uz kuru norāda arguments sep. Secīgi izsaucot funkciju strtok, virkne str tiek sadalīta daļās (marķieros).

“Pirmais funkcijas strtok izsaukums norāda sadalāmās virknes sākumu (str) un atdalītājus saturošās virknes sākumu (sep). Funkcija strtok sākas, pa vienam apskatot virknes str rakstzīmes un meklējot rakstzīmi, kas neietilpst norobežotajā virknē sep. Ja virknē str rindas beigu rakstzīme tiek sastapta, pirms tika atrasta rakstzīme, kas nav iekļauta virknē sep, tad virkni str nevar sadalīt daļās un tiek atgriezts nulles rādītājs (NULL). Ja tiek atrasta šāda rakstzīme, tas tiek uzskatīts par virknes str pirmās daļas sākumu."

Tālāk funkcija strtok meklē atdalītāju, tas ir, rakstzīmi, kas iekļauta virknē sep. Ja šāda rakstzīme netiek atrasta, tiek uzskatīts, ka virkne str sastāv no vienas daļas, un turpmākie string dalījumi atgriezīs nulles rādītāju. Ja tiek atrasts šāds simbols. tad tas tiek aizstāts ar nulles rakstzīmi (rindas beigu rakstzīmi). Tālāk funkcija strtok atceras pašreizējo pozīciju (rādītājs uz rakstzīmi, no kuras sāksies nākamās rindas daļas meklēšana) un atgriež rādītāju uz pirmās atlasītās rindas daļas sākumu.

Ja funkcija strtok atgrieza rādītāju, kas nav nulle, varat turpināt sadalīt virkni str gabalos. Lai turpinātu virknes sadalīšanu, funkcija strtok tiek izsaukta vēlreiz, bet rādītāja vietā uz sadalāmo virkni kā pirmais papildinājums tiek norādīts NULL. Šajā gadījumā funkcija strtok turpinās sadalīšanu no atcerētās adreses. Sadalīšanas algoritms paliks nemainīgs.

Piemērs:

Piemērā virkne “test1/test2/test3/test4” ir sadalīta daļās, izmantojot atdalītāju “/”, izmantojot funkciju strtok. Sadalīšanas rezultāts tiek izvadīts uz konsoli.

Rezultāts:

Konsoles izvade:





Tops