funcții strtok. Cum funcționează funcția strtok în C? Exemplu: codul sursă al programului

Alt Alias

strtok

REVIZUIRE

#include

char *strok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim,car**saveptr);

Cerințe pentru macrocomanda de testare a proprietăților pentru glibc (a se vedea feature_test_macros(7)):

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

DESCRIERE

Funcţie strtok() împarte un șir într-o secvență de zero sau mai multe jetoane nevide. La primul apel strtok() șirul de analizat trebuie specificat în argument str. În fiecare apel ulterior care parsează același șir, valoarea str trebuie să fie NULL.

În argumentare delim este specificat un set de octeți care sunt considerați separatori de jetoane în șirul analizat. Apelantul poate specifica linii diferite în delimîn apelurile ulterioare la analizarea aceluiași șir.

Fiecare apel strtok() returnează un pointer către un șir terminat cu nul care conține următorul token. Această linie nu include un octet delimitator. Dacă nu mai sunt jetoane, atunci strtok() returnează NULL.

Secvență de apeluri strtok(), care operează pe un singur șir, menține un pointer care specifică punctul în care începe căutarea următorului simbol. Primul apel strtok() atribuie acestui pointer o referință la primul octet al șirului. Începutul următorului jeton este determinat de căutarea înainte în interior str octetul următor nu este un delimitator. Dacă se găsește un octet, acesta este considerat începutul următorului simbol. Dacă un astfel de octet nu este găsit, atunci nu mai există jetoane și strtok() returnează NULL (pentru un șir gol sau delimitat, caz în care NULL va fi returnat prima dată când este apelat strtok()).

Sfârșitul fiecărui jeton este găsit printr-o căutare înainte până când este găsit un octet delimitator sau un octet nul final ("\0"). Dacă se găsește un octet delimitator, acesta este înlocuit cu un octet nul pentru a termina jetonul curent și strtok() stochează un pointer către următorul octet; acest indicator va fi folosit ca punct de plecare atunci când se caută următorul simbol. În acest caz strtok() returnează un pointer la începutul simbolului găsit.

Din descrierea de mai sus, rezultă că o secvență de doi sau mai mulți octeți delimitatori adiacenți în linia care este scanată este considerată un delimitator unic, iar octeții delimitatori la începutul sau la sfârșitul șirului sunt ignorați. Cu alte cuvinte, jetoanele s-au întors strtok() - întotdeauna șiruri nevide. Adică, de exemplu, dacă există o linie " aaa;;bbb,", apoi apelurile ulterioare strtok() cu separatori de linii date " ;, „ar returna șirurile” aaa" Și " bbb" și apoi un pointer nul.

Funcţie strtok_r() este versiunea reintrată strtok(). Argument saveptr este un pointer către o variabilă char * care este folosit intern strtok_r() pentru a ține cont de contextul dintre apelurile ulterioare atunci când analizați același șir.

La primul apel strtok_r() sens str trebuie să indice șirul care este analizat și valoarea saveptr ignorat. La apelurile ulterioare valoarea str trebuie să fie NULL și valoarea saveptr nu ar trebui să se schimbe față de apelul anterior.

Diferite rânduri pot fi analizate simultan pe mai multe rulări strtok_r() cu argumente diferite saveptr.

VALOARE RETURNATĂ

Funcții strtok() Și strtok_r() returnează un pointer la următorul token sau NULL dacă nu mai există simboluri.

ATRIBUTE

Pentru o descriere a termenilor din această secțiune, consultați atribute(7).
Interfață Atribut Sens
strtok() inofensivă în firenesigur (MT-Unsafe race:strtok)
strtok_r() inofensivă în fireinofensiv (MT-Safe)

CONFORMITATE

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

Defecte

Utilizați aceste funcții cu precauție. Vă rugăm să rețineți că: * Aceste funcții își modifică primul argument. * Aceste funcții nu pot fi utilizate cu șiruri constante. * Identitatea octetului separator este pierdută. * La analiza funcției strtok() utilizează un buffer static și, prin urmare, nu este sigur pentru fire. Utilizare strtok_r() în acest caz.

EXEMPLU

Programul de mai jos folosește bucle imbricate pentru a apela strtok_r() pentru a împărți un șir în jetoanele sale constitutive. În primul parametru Linie de comanda este specificat şirul de analizat. Al doilea parametru specifică octeții de separare, care sunt folosiți pentru a împărți șirul în jetoane „compozite”. Al treilea parametru specifică octeții de separare, care sunt utilizați pentru a separa jetoanele „compozite” în subjetoane.

Exemplu de ieșire a programului:

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

Codul sursă al programului

#include #include #include int main(int argc, char *argv) ( char *str1, *str2, *token, *subtoken; char *saveptr1, *saveptr2; int j; if (argc != 4) ( fprintf(stderr, "Utilizare: % 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, token); for (str2 = token; ; str2 = NULL) (subtoken = strtok_r(str2, argv, &saveptr2); if (subtoken == NULL) break; printf(" --> %s\n", subtoken); ) ) exit(EXIT_SUCCESS); )

Un alt exemplu de program care utilizează strtok(), poate fi găsit în getaddrinfo_a(3).

Funcția strtok() returnează un pointer la următorul token din șirul indicat de str1. Caracterele care alcătuiesc șirul adresat de str2 sunt delimitatorii care definesc jetonul. Dacă nu există niciun simbol de returnat, este returnat un pointer nul.

În versiunea C99, calificativul de restricție este aplicat parametrilor str1 și str2.

Pentru a împărți un șir în jetoane, prima dată când este apelat strtok(), parametrul str1 trebuie să indice începutul șirului. Apelurile ulterioare la funcție trebuie să utilizeze un pointer nul ca parametru str1. În acest caz, șirul complet va fi modificat de fiecare dată când funcția este apelată.

Fiecare apel la funcția strtok() poate folosi un set diferit de delimitatori de simboluri.

Funcția strtok() oferă un mijloc de a reduce un șir la părțile sale constitutive. De exemplu, următorul program tokenizează șirul „Unu, doi și trei”.

#include #include int main(void) char *p; p = strtok("Unu, doi și trei.", ","); printf(p); do ( p = strtok(NULL, ",. "); if(p) printf("|%s", p); ) while(p), returnează 0; )

Rezultatul acestui program este următorul.

Unul | doi | și | Trei

Observați cum funcția strtok() este apelat mai întâi cu șirul original, dar apelurile ulterioare la acesta folosesc NULL ca prim argument. Funcția strtok() menține un pointer intern către șirul care este procesat. Dacă primul argument pentru strtok() indică un șir, indicatorul intern este setat la începutul acelui șir. Dacă primul argument este NULL, strtok() continuă procesarea șirului anterior, începând de la poziția învățată în pasul anterior și avansează pointerul intern pe măsură ce următorul token este preluat. Astfel, funcția strtok() „traversează” întregul șir. Observați, de asemenea, cum se modifică șirul delimitator la primul și următoarele apeluri la funcție. Delimitatorii pot fi definiți diferit pentru fiecare apel.

#include char *strok(char * str1, const char * str2);

Funcția strtok() returnează un pointer la următorul token din șirul adresat de parametru str1. Caractere care formează șirul adresat de parametru str2, sunt delimitatori care definesc un simbol. Dacă nu există niciun simbol de returnat, este returnat un pointer nul.

În versiunea C99 la parametri str1Și str2 Se aplică calificativul de restricție.

Pentru a împărți un șir în jetoane, prima dată când apelați strtok(), parametrul str1 trebuie să indice începutul acestei linii. La apelurile ulterioare la funcția ca parametru str1 trebuie să utilizați un pointer nul. În acest fel, întregul șir este împărțit în jetoane.

Fiecare apel la funcția strtok() poate folosi un set diferit de delimitatori.

Exemplu

Acest program rupe șirul „Iarba este verde, soarele strălucește” în jetoane separate prin spații și virgule. Rezultatul va fi

Iarba|devine verde|soarele|sclipici #include #include int main(void) ( char *p; p = strtok ("Iarba este verde, soarele strălucește", " "); printf(p); do ( p = strtok ("\0", ", ") ; if(p ) printf("|%s", p); ) while(p); return 0; )

Sintaxă:

#include
char *strtok(char *str, const char *sep);

Argumente:

str – indicator către șirul care urmează să fie împărțit.
sep – pointer către un șir care conține un set de caractere delimitare.

Valoare returnată:

NULL – dacă șirul str nu poate fi împărțit în părți.
Un indicator către primul caracter al părții selectate a șirului.

Descriere:

Funcția strtok selectează următoarea parte a șirului indicată de argumentul str, separată de unul dintre caracterele delimitare specificate în șirul indicat de argumentul sep. Apelurile consecutive la funcția strtok duc la împărțirea șirului str în părți (jetoane).

„Primul apel la funcția strtok specifică începutul șirului care trebuie împărțit (str) și începutul șirului care conține separatori (sept). Funcția strtok începe prin a căuta printre caracterele șirului str pe rând și căutând un caracter care nu este conținut în șirul delimitat sep. Dacă în șirul str caracterul de final de linie este întâlnit înainte de a fi găsit un caracter care nu este inclus în șirul sep, atunci șirul str nu poate fi împărțit în părți și este returnat un pointer nul (NULL). Dacă se găsește un astfel de caracter, acesta este considerat începutul primei părți a șirului str."

În continuare, funcția strtok caută separatorul, adică caracterul inclus în șirul sep. Dacă un astfel de caracter nu este găsit, atunci șirul str este considerat a fi format dintr-o parte, iar împărțirile ulterioare ale șirului str vor returna un pointer nul. Dacă se găsește un astfel de simbol. apoi este înlocuit cu un caracter nul (caracter de sfârșit de linie). Apoi, funcția strtok își amintește poziția curentă (un indicator către caracterul de la care va începe căutarea următoarei părți a liniei) și returnează un pointer la începutul primei părți ale liniei selectate.

Dacă funcția strtok a returnat un pointer non-null, puteți continua să împărțiți șirul str în bucăți. Pentru a continua împărțirea șirului, funcția strtok este apelată din nou, dar în loc de un pointer către șirul care urmează să fie împărțit, NULL este specificat ca prima creștere. În acest caz, funcția strtok va continua să se despartă de adresa reținută. Algoritmul de partiţionare va rămâne acelaşi.

Exemplu:

În exemplu, șirul „test1/test2/test3/test4” este împărțit în părți folosind delimitatorul „/” folosind funcția strtok. Rezultatul divizării este scos la consolă.

Rezultat:

Ieșire din consolă:





Top