strtok функции. Како функционира функцијата strtok во C? Пример: изворен код на програмата

Други алијас

Стрток

ПРЕГЛЕД

#вклучи

char *strok(char *ул, const char *делим);
char *strtok_r(char *ул, const char *делим, знак**saveptr);

Барања за макрото за тестирање на имотот за glibc (види функција_тест_макроа(7)):

strtok_r(): _SVID_SOURCE || _BSD_ИЗВОР || _POSIX_C_SOURCE >= 1 || _XOPEN_ИЗВОР || _POSIX_ИЗВОР

ОПИС

Функција Стрток() разделува низа во низа од нула или повеќе непразни токени. На првиот повик Стрток() низата што треба да се анализира мора да биде наведена во аргументот ул. Во секој следен повик што ја анализира истата низа, вредноста улмора да биде NULL.

Во расправија делимодредено е множество бајти кои се сметаат за раздвојувачи на токени во анализираната низа. Повикувачот може да наведе различни линии во делимво следните повици при парсирање на истата низа.

Секој повик Стрток() враќа покажувач на низа со нула-завршена низа што го содржи следниот токен. Оваа линија не вклучува бајт за разграничување. Ако нема повеќе токени, тогаш Стрток() враќа NULL.

Секвенца на повици Стрток(), кои работат на една низа, одржува покажувач кој ја одредува точката во која започнува пребарувањето за следниот токен. Првиот повик Стрток() му доделува на овој покажувач референца на првиот бајт од низата. Почетокот на следниот токен се одредува со пребарување напред внатре улследниот бајт не е разграничувач. Ако се најде бајт, тој се зема како почеток на следниот токен. Ако не се најде таков бајт, тогаш нема повеќе токени и Стрток() враќа NULL (за празна или ограничена низа, во кој случај NULL ќе се врати првиот пат кога ќе се повика Стрток()).

Крајот на секој токен се наоѓа со пребарување напред додека не се најде бајт за разграничување или последен нула бајт („\0“). Ако се најде разграничен бајт, тој се заменува со нула бајт за да се прекине тековниот токен, и Стрток() складира покажувач до следниот бајт; овој покажувач ќе се користи како почетна точка при пребарување на следниот токен. Во овој случај Стрток() враќа покажувач на почетокот на пронајдениот токен.

Од описот погоре, следува дека низа од два или повеќе соседни разграничувачки бајти во линијата што се скенира се смета за еден разграничувач, а разграничувачките бајти на почетокот или на крајот на низата се игнорираат. Со други зборови, жетоните се вратија Стрток() - секогаш непразни низи. Тоа е, на пример, ако има линија " ааа;;ббб,“, потоа последователни повици Стрток() со дадени сепаратори на линии " ;, „Би ги вратил жиците“ ааа"И" ббб“ и потоа нула покажувач.

Функција strtok_r() е верзијата за повторно влегување Стрток(). Аргумент saveptrе покажувач на променлива знак *што се користи внатрешно strtok_r() да се земе предвид контекстот помеѓу последователните повици при парсирање на истата низа.

На првиот повик strtok_r() значење улмора да укаже на низата што се анализира и вредноста saveptrигнорирани. На следните повици вредноста улмора да биде NULL и вредноста saveptrне треба да се менува од претходниот повик.

Различни редови може да се анализираат истовремено низ повеќекратни работи strtok_r() со различни аргументи saveptr.

ПОВРАТНА ВРЕДНОСТ

Функции Стрток() И strtok_r() вратете покажувач на следниот токен или NULL ако нема повеќе токени.

АТРИБУТИ

За опис на термините во овој дел, видете атрибути(7).
Интерфејс Атрибут Значење
Стрток() безопасност во нишкитенебезбедно (MT-Небезбедна трка:strtok)
strtok_r() безопасност во нишкитебезопасен (MT-Safe)

УСОГЛАСЕНОСТ

Стрток() POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD. strtok_r() POSIX.1-2001, POSIX.1-2008.

ДЕФЕКТИ

Користете ги овие карактеристики со претпазливост. Ве молиме имајте предвид дека: * Овие функции го менуваат нивниот прв аргумент. * Овие функции не можат да се користат со константни низи. * Идентитетот на бајтот на сепараторот е изгубен. * При анализа на функцијата Стрток() користи статички бафер и затоа не е безбеден за нишки. Користете strtok_r() во овој случај.

ПРИМЕР

Програмата подолу користи вгнездени јамки за повикување strtok_r() да се подели низа на нејзините составни токени. Во првиот параметар командна линијасе одредува низата што треба да се анализира. Вториот параметар го одредува бајтот(ите) на сепараторот, кој се користи за поделба на низата на „композитни“ токени. Третиот параметар го одредува бајтот(ите) на сепараторот, кој се користи за одвојување на „композитните“ токени во подтокени.

Пример за излез од програмата:

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

Изворниот код на програмата

#вклучи #вклучи #вклучи int main(int argc, char *argv) (char *str1, *str2, *token, *subtoken; char *saveptr1, *saveptr2; int j; if (argc != 4) ( fprintf(stderr, "Употреба: % s стринг delim subdelim\n", argv); излез (EXIT_FAILURE); ) за (j = 1, str1 = argv; ; j++, str1 = NULL) (токен = strtok_r(str1, argv, &saveptr1); ако (токен = = NULL) пауза; printf ("%d: %s\n", j, токен); за (str2 = токен; ; str2 = NULL) ( подтокен = strtok_r(str2, argv, &saveptr2); ако (подтокен == NULL) пауза; printf (" --> %s\n", подтокен); ) ) излез (EXIT_SUCCESS); )

Друг пример на програма која користи Стрток(), може да се најде во getaddrinfo_a(3).

Функцијата strtok() враќа покажувач на следниот токен во низата кон која покажува str1. Карактерите што ја сочинуваат низата адресирана од str2 се разграничувачите што го дефинираат токенот. Ако нема токен за враќање, се враќа нула покажувач.

Во верзијата C99, квалификаторот за ограничување се применува на параметрите str1 и str2.

За да се подели низа на токени, првиот пат кога се повикува sttok(), параметарот str1 мора да покажува на почетокот на низата. Следните повици до функцијата мора да користат нула покажувач како параметар str1. Во овој случај, комплетната низа ќе се менува секогаш кога ќе се повика функцијата.

Секој повик до функцијата strtok() може да користи различен сет на разграничувачи на токени.

Функцијата strtok() обезбедува средство за намалување на низата на нејзините составни делови. На пример, следната програма ја токенизира низата „Еден, два и три“.

#вклучи #вклучи int main(void) char *p; p = strtok("Еден, два и три.", ","); printf(p); do ( p = strtok(NULL, ",. "); if(p) printf("|%s", p); ) while(p), врати 0; )

Резултатот од оваа програма е како што следува.

Еден | два | и | три

Забележете како strtok функција() прво се повикува со оригиналната низа, но последователните повици кон неа користат NULL како прв аргумент. Функцијата strtok() одржува внатрешен покажувач на низата што се обработува. Ако првиот аргумент на strtok() покажува на низа, внатрешниот покажувач се поставува на почетокот на таа низа. Ако првиот аргумент е NULL, strtok() продолжува со обработка на претходната низа, почнувајќи од позицијата научена во претходниот чекор, и го унапредува внатрешниот покажувач додека се враќа следниот токен. Така, функцијата strtok() ја „преминува“ целата низа. Забележете и како се менува низата за разграничување на првите и следните повици до функцијата. Разграничувачите може да се дефинираат различно за секој повик.

#вклучи char *strok(char * ул 1, const char * ул2);

Функцијата strtok() враќа покажувач на следниот токен во низата адресирана од параметарот ул 1. Карактери кои ја формираат низата адресирана од параметарот ул2, се разграничувачи кои дефинираат токен. Ако нема токен за враќање, се враќа нула покажувач.

Во верзијата C99 до параметрите ул 1И ул2Се применува квалификаторот за ограничување.

За да поделите низа на токени, првиот пат кога ќе го повикате strtok(), параметарот ул 1мора да укаже на почетокот на оваа линија. На следните повици до функцијата како параметар ул 1треба да користите нула покажувач. На овој начин, целата низа се дели на токени.

Секој повик до функцијата strtok() може да користи различен сет на разграничувачи.

Пример

Оваа програма ја раскинува низата „Тревата е зелена, сонцето сјае“ во токени одделени со празни места и запирки. Резултатот ќе биде

Тревата|позеленува|сонцето|сјај #вклучува #вклучи int main(void) ( char *p; p = strtok ("Тревата е зелена, сонцето сјае", " "); printf(p); do ( p = strtok("\0", ", ") ; if(p ) printf("|%s", p); ) while(p); врати 0; )

Синтакса:

#вклучи
char *strtok(char *str, const char *sep);

Аргументи:

str – покажувач на низата што треба да се подели.
sep – покажувач на низа што содржи множество разграничувачки знаци.

Повратна вредност:

NULL – ако стрингот str не може да се подели на делови.
Покажувач кон првиот знак од избраниот дел од низата.

Опис:

Функцијата strtok го избира следниот дел од стрингот кон кој е посочен со аргументот str, одделен со еден од разграничувачките знаци наведени во низата кон која е посочена со аргументот sep. Последователните повици до функцијата strtok резултираат со делење на низата str на делови (токени).

„Првиот повик до функцијата strtok го одредува почетокот на низата што треба да се подели (str) и почетокот на низата што содржи сепаратори (сеп). Функцијата strtok започнува со гледање низ знаците на низата str еден по еден и барање знак што не е содржан во разграничената низа sep. Ако во низата str се сретне знакот на крајот на линијата пред да се најде знак што не е вклучен во низата sep, тогаш низата str не може да се подели на делови и се враќа нула покажувач (NULL). Доколку се најде таков знак, се смета дека е почеток на првиот дел од стрингот.

Следно, функцијата strtok го бара сепараторот, односно знакот вклучен во низата sep. Ако таков знак не се најде, тогаш се смета дека низата str се состои од еден дел и последователните поделби на низата str ќе вратат нула покажувач. Доколку се најде таков симбол. тогаш се заменува со нула знак (знак на крајот на линијата). Следно, функцијата strtok ја памети моменталната позиција (покажувач на знакот од кој ќе започне пребарувањето за следниот дел од низата) и враќа покажувач на почетокот на првиот избран дел од низата.

Ако функцијата strtok врати покажувач без нула, можете да продолжите да ја делите низата низа на парчиња. За да продолжи со разделување на низата, повторно се повикува функцијата strtok, но наместо покажувач кон низата што треба да се подели, NULL е наведен како прво зголемување. Во овој случај, функцијата strtok ќе продолжи да се дели од запаметената адреса. Алгоритмот за партиција ќе остане ист.

Пример:

Во примерот, низата „test1/test2/test3/test4“ е поделена на делови користејќи го разграничувачот „/“ користејќи ја функцијата strtok. Резултатот од поделбата е излез на конзолата.

Резултат:

Излез од конзола:





Врв