strtok(3) Library Functions Manual strtok(3) NUME strtok, strtok_r - extrage simboluri din iruri BIBLIOTECA Biblioteca C standard (libc, -lc) SINOPSIS #include char *strtok(char *_Nullable restrict str, const char *restrict delim); char *strtok_r(char *_Nullable restrict str, const char *restrict delim, char **restrict saveptr); Cerine pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultai feature_test_macros(7)): strtok_r(): _POSIX_C_SOURCE || /* glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE DESCRIERE Funcia strtok() descompune un ir de caractere intr-o secvena de zero sau mai multe simboluri nevide. La primul apel la strtok(), irul de caractere care trebuie analizat trebuie specificat in str. In fiecare apel ulterior care ar trebui sa analizeze acelai ir de caractere, str trebuie sa fie NULL. Argumentul delim specifica un set de octei care delimiteaza simbolurile din irul analizat. Apelantul poate specifica iruri diferite in delim in apeluri succesive care analizeaza acelai ir. Fiecare apel la strtok() returneaza un indicator catre un ir cu terminaie nula care conine urmatorul simbol. Acest ir nu include octetul de delimitare. Daca nu se mai gasesc alte simboluri, strtok() returneaza NULL. O secvena de apeluri la strtok() care opereaza asupra aceluiai ir de caractere menine un indicator care determina punctul de la care incepe cautarea urmatorului simbol. Primul apel la strtok() stabilete acest indicator la primul octet al irului de caractere. Inceputul urmatorului simbol este determinat prin scanarea inainte pentru urmatorul octet nedelimitator din str. Daca se gasete un astfel de octet, acesta este considerat ca fiind inceputul urmatorului simbol. Daca nu se gasete un astfel de octet, atunci nu mai exista alte simboluri, iar strtok() returneaza NULL. (Un ir de caractere care este gol sau care conine numai delimitatori va face astfel ca strtok() sa returneze NULL la primul apel). Sfaritul fiecarui simbol este gasit prin scanarea inainte pana cand este gasit fie urmatorul octet de delimitare, fie octetul nul de terminare ('\0'). In cazul in care se gasete un octet de delimitare, acesta este suprascris cu un octet nul pentru a incheia simbolul curent, iar strtok() salveaza un indicator la urmatorul octet; acest indicator va fi utilizat ca punct de plecare la cautarea urmatorului simbol. In acest caz, strtok() returneaza un indicator la inceputul simbolului gasit. Din descrierea de mai sus, rezulta ca o secvena de doi sau mai muli octei delimitatori contigui in irul analizat este considerata a fi un singur delimitator i ca octeii delimitatori de la inceputul sau sfaritul irului sunt ignorai. Altfel spus: simbolurile returnate de strtok() sunt intotdeauna iruri de caractere nevide. Astfel, de exemplu, avand in vedere irul ,,aaa;;bbb,", apelurile succesive la strtok() care specifica irul delimitator ,,;," ar returna irurile ,,aaa" i ,,bbb", iar apoi un indicator nul. Funcia strtok_r() este o versiune reentranta a strtok(). Argumentul saveptr este un indicator catre o variabila char * care este utilizata intern de strtok_r() pentru a menine contextul intre apelurile succesive care analizeaza acelai ir de caractere. La primul apel la strtok_r(), str trebuie sa indice irul de caractere care urmeaza sa fie analizat, iar valoarea lui *saveptr este ignorata (dar a se vedea seciunea VERSIUNI). In apelurile ulterioare, str ar trebui sa fie NULL, iar saveptr (i memoria tampon catre care acesta indica) ar trebui sa fie neschimbata de la apelul anterior. Diferite iruri de caractere pot fi analizate concomitent folosind secvene de apeluri la strtok_r() care specifica diferite argumente saveptr. VALOAREA RETURNATA Funciile strtok() i strtok_r() returneaza un indicator catre urmatorul simbol, sau NULL daca nu mai exista simboluri. ATRIBUTE Pentru o explicaie a termenilor folosii in aceasta seciune, a se vedea attributes(7). +------------------------+---------------------+-----------------------+ |Interfaa | Atribut | Valoare | +------------------------+---------------------+-----------------------+ |strtok() | Sigurana firelor | MT-Unsafe race:strtok | +------------------------+---------------------+-----------------------+ |strtok_r() | Sigurana firelor | MT-Safe | +------------------------+---------------------+-----------------------+ VERSIUNI In unele implementari, *saveptr trebuie sa fie NULL la primul apel la strtok_r() care este utilizat pentru a analiza str. STANDARDE strtok() C11, POSIX.1-2008. strtok_r() POSIX.1-2008. ISTORIC strtok() POSIX.1-2001, C89, SVr4, 4.3BSD. strtok_r() POSIX.1-2001. ERORI Fii precaut atunci cand utilizai aceste funcii. Daca le utilizai, reinei ca: o Aceste funcii modifica primul lor argument. o Aceste funcii nu pot fi utilizate pe iruri constante. o Identitatea octetului de delimitare este pierduta. o Funcia strtok() utilizeaza o memorie tampon statica in timpul analizei, deci nu este sigura pentru fire. Utilizai strtok_r() daca acest lucru este important pentru dumneavoastra. EXEMPLE Programul de mai jos folosete bucle imbricate care utilizeaza strtok_r() pentru a impari un ir de caractere intr-o ierarhie de simboluri pe doua niveluri. Primul argument din linia de comanda specifica irul de caractere care urmeaza sa fie analizat. Al doilea argument specifica octetul (octeii) delimitator(i) care urmeaza sa fie utilizai pentru a separa irul in simboluri ,,majore". Al treilea argument specifica octetul (octeii) delimitator(i) care trebuie utilizai pentru a separa simbolurile ,,majore" in sub-simboluri. Un exemplu de ieire produsa de acest program este urmatorul: $ ./a.out 'a/bbb///cc;xxx:yyy:' ':;' '/' 1: a/bbb///cc --> a --> bbb --> cc 2: xxx --> xxx 3: yyy --> yyy Sursa 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 ir delimitator sub-delimitator\n", argv[0]); exit(EXIT_FAILURE); } for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) { token = strtok_r(str1, argv[2], &saveptr1); if (token == NULL) break; printf("%d: %s\n", j, simbol); for (str2 = token; ; str2 = NULL) { subtoken = strtok_r(str2, argv[3], &saveptr2); if (subtoken == NULL) break; printf("\t --> %s\n", sub-simbo); } } exit(EXIT_SUCCESS); } Un alt exemplu de program care utilizeaza strtok() poate fi gasit in getaddrinfo_a(3). CONSULTAI I memchr(3), strchr(3), string(3), strpbrk(3), strsep(3), strspn(3), strstr(3), wcstok(3) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.15 17 mai 2025 strtok(3)