strtok функциялары. strtok функциясы C тілінде қалай жұмыс істейді? Мысалы: бағдарламаның бастапқы коды

Басқа бүркеншік ат

strtok

ШОЛУ

#қосу

char *штрих(char *көш, const таңба *делим);
char *strtok_r(char *көш, const таңба *делим,char**сақтау);

glibc үшін сипат сынау макростарына қойылатын талаптар (қараңыз мүмкіндік_сынағы_макростары(7)):

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

СИПАТТАМАСЫ

Функция strtok() жолды нөл немесе одан да көп бос емес белгілер тізбегіне бөледі. Бірінші қоңырауда strtok() талданатын жол аргументте көрсетілуі керек көш. Бірдей жолды талдайтын әрбір келесі қоңырауда мән көш NULL болуы керек.

Аргументте делимталданатын жолда таңбалауыш бөлгіштер болып саналатын байттар жинағы көрсетіледі. Қоңырау шалушы әр түрлі жолдарды көрсете алады делимсол жолды талдау кезінде кейінгі қоңырауларда.

Әрбір қоңырау strtok() келесі таңбалауышты қамтитын нөлмен аяқталатын жолға көрсеткішті қайтарады. Бұл жолда бөлгіш байтты қамтымайды. Егер басқа белгілер болмаса, онда strtok() NULL мәнін қайтарады.

Қоңыраулар реті strtok() бір жолда жұмыс істейді, келесі таңбалауышты іздеу басталатын нүктені көрсететін көрсеткішті сақтайды. Бірінші қоңырау strtok() бұл көрсеткішті жолдың бірінші байтына сілтеме тағайындайды. Келесі таңбалауыштың басталуы алға қарай іздеу арқылы анықталады көшкелесі байт бөлгіш емес. Егер байт табылса, ол келесі таңбалауыштың басы ретінде қабылданады. Егер мұндай байт табылмаса, онда басқа таңбалауыштар жоқ және strtok() NULL мәнін қайтарады (бос немесе бөлінген жол үшін, бұл жағдайда NULL бірінші рет шақырылғанда қайтарылады. strtok()).

Әрбір таңбалауыштың соңы бөлгіш байт немесе соңғы бос байт ("\0") табылмайынша алға іздеу арқылы табылады. Егер бөлгіш байт табылса, ол ағымдағы таңбалауышты тоқтату үшін бос байтпен ауыстырылады және strtok() келесі байтқа көрсеткішті сақтайды; бұл көрсеткіш келесі таңбалауышты іздеу кезінде бастапқы нүкте ретінде пайдаланылады. Бұл жағдайда strtok() табылған таңбалауыштың басына көрсеткішті қайтарады.

Жоғарыдағы сипаттамадан сканерленетін жолдағы екі немесе одан да көп шектесетін бөлгіш байттардың тізбегі жалғыз бөлгіш ретінде қарастырылатыны және жолдың басындағы немесе соңындағы бөлгіш байттардың еленбейтіндігі шығады. Басқаша айтқанда, белгілер қайтарылды strtok() - әрқашан бос емес жолдар. Яғни, мысалы, егер сызық болса « ааа;;ббб,", содан кейін келесі қоңыраулар strtok() берілген жол бөлгіштерімен» ;, «жолдарды қайтарады» ааа« Және » bbb", содан кейін нөлдік көрсеткіш.

Функция strtok_r() қайта енген нұсқасы болып табылады strtok(). Аргумент сақтауайнымалыға көрсеткіш болып табылады таңба *ол іштей қолданылады strtok_r() бір жолды талдау кезінде кейінгі шақырулар арасындағы контекстті ескеру.

Бірінші қоңырауда strtok_r() мағынасы көшталданатын жолды және мәнді көрсетуі керек сақтауеленбейді. Келесі шақыруларда мән көш NULL және мән болуы керек сақтауалдыңғы қоңыраудан бері өзгермеуі керек.

Әр түрлі жолдарды бір уақытта бірнеше жүгірістерде талдауға болады strtok_r() әртүрлі аргументтермен сақтау.

ҚАЙТАРУ МӘН

Функциялар strtok() Және strtok_r() келесі таңбалауышқа көрсеткішті қайтарыңыз немесе басқа таңбалауыштар болмаса NULL.

АТРИБУТТАР

Осы бөлімдегі терминдердің сипаттамасын қараңыз атрибуттар(7).
Интерфейс Атрибут Мағынасы
strtok() жіптердегі зиянсыздыққауіпті (MT-қауіпсіз жарыс: strtok)
strtok_r() жіптердегі зиянсыздықзиянсыз (MT-Safe)

СӘЙКЕСТІК

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

АҚАУЛАР

Бұл мүмкіндіктерді абайлап пайдаланыңыз. Мынаны ескеріңіз: * Бұл функциялар өздерінің бірінші аргументін өзгертеді. * Бұл функцияларды тұрақты жолдармен пайдалану мүмкін емес. * Бөлгіш байттың идентификациясы жоғалды. * Функцияны талдау кезінде strtok() статикалық буферді пайдаланады және сондықтан ағынмен қауіпсіз емес. Қолдану strtok_r() Бұл жағдайда.

МЫСАЛ

Төмендегі бағдарлама қоңырау шалу үшін кірістірілген циклдарды пайдаланады strtok_r() жолды оның құрамдас таңбалауыштарына бөлу үшін. Бірінші параметрде пәрмен жолыталданатын жол көрсетіледі. Екінші параметр жолды «композиттік» таңбалауыштарға бөлу үшін пайдаланылатын бөлгіш байтты(ларды) анықтайды. Үшінші параметр «құрама» таңбалауыштарды субтокендерге бөлу үшін қолданылатын бөлгіш байт(тарды) анықтайды.

Бағдарлама шығысының мысалы:

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

Бағдарламаның бастапқы коды

#қосу #қосу #қосу int main(int argc, char *argv) ( char *str1, *str2, *токен, *қосалқы белгі; char *saveptr1, *saveptr2; int j; if (argc != 4) ( fprintf(stderr, "Қолдану: % s string delim subdelim\n", argv); exit(EXIT_FAILURE); ) үшін (j = 1, str1 = argv; ; j++, str1 = NULL) ( token = strtok_r(str1, argv, &saveptr1); егер (таңбалауыш = = NULL) үзу; printf("%d: %s\n", j, таңбалауыш); үшін (str2 = таңбалауыш; ; str2 = NULL) (ішкі таңбалау = strtok_r(str2, argv, &saveptr2); егер (қосалқы таңбалау == NULL) үзу; printf(" --> %s\n", ішкі белгі); ) ) exit(EXIT_SUCCESS); )

Бағдарламаны қолданудың тағы бір мысалы strtok(), бөлімінен табуға болады getaddrinfo_a(3).

strtok() функциясы str1 арқылы көрсетілген жолдағы келесі таңбалауышқа көрсеткішті қайтарады. str2 арқылы адрестелген жолды құрайтын таңбалар таңбалауышты анықтайтын бөлгіштер болып табылады. Қайтарылатын таңбалауыш болмаса, нөлдік көрсеткіш қайтарылады.

C99 нұсқасында шектеу квалификациясы str1 және str2 параметрлеріне қолданылады.

Жолды таңбалауыштарға бөлу үшін strtok() бірінші рет шақырылады, 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 *штрих(char * str1, const таңба * str2);

strtok() функциясы параметр арқылы адрестелген жолдағы келесі таңбалауышқа көрсеткішті қайтарады str1. Параметр арқылы адрестелген жолды құрайтын таңбалар str2, таңбалауышты анықтайтын бөлгіштер. Қайтарылатын таңбалауыш болмаса, нөлдік көрсеткіш қайтарылады.

C99 нұсқасында параметрлерге str1Және str2Шектеу квалификациясы қолданылады.

Жолды таңбалауыштарға бөлу үшін бірінші рет strtok(), параметрін шақырған кезде str1осы жолдың басын көрсету керек. Функцияға параметр ретінде кейінгі шақыруларда str1нөлдік көрсеткішті пайдалану керек. Осылайша, бүкіл жол белгілерге бөлінеді.

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) және бөлгіштері бар жолдың басын көрсетеді (sep). strtok функциясы str жолының таңбаларын бір-бірден қарап шығудан және бөлінген сеп жолында қамтылмаған таңбаны іздеуден басталады. Егер str жолында жолдың соңы таңба жолына қосылмаған таңба табылмай тұрып кездессе, онда str жолын бөліктерге бөлуге болмайды және нөлдік көрсеткіш (NULL) қайтарылады. Егер мұндай таңба табылса, ол str жолының бірінші бөлігінің басы болып саналады».

Әрі қарай, strtok функциясы бөлгішті, яғни sep жолына енгізілген таңбаны іздейді. Егер мұндай таңба табылмаса, онда str жолы бір бөліктен тұрады деп есептеледі және str жолының кейінгі бөлінуі нөлдік көрсеткішті қайтарады. Егер мұндай белгі табылса. содан кейін ол нөлдік таңбамен ауыстырылады (жол соңындағы таңба). Әрі қарай, strtok функциясы ағымдағы орынды есте сақтайды (жолдың келесі бөлігін іздеу басталатын таңбаға көрсеткіш) және жолдың бірінші таңдалған бөлігінің басына көрсеткішті қайтарады.

Егер strtok функциясы бос емес көрсеткішті қайтарса, str жолын бөліктерге бөлуді жалғастыра аласыз. Жолды бөлуді жалғастыру үшін strtok функциясы қайта шақырылады, бірақ бөлінетін жолға көрсеткіштің орнына бірінші кеңейту ретінде NULL мәні көрсетіледі. Бұл жағдайда strtok функциясы есте сақталған мекенжайдан бөлуді жалғастырады. Бөлу алгоритмі өзгеріссіз қалады.

Мысалы:

Мысалда «test1/test2/test3/test4» жолы strtok функциясы арқылы «/» бөлгішінің көмегімен бөліктерге бөлінген. Бөлудің нәтижесі консольге шығарылады.

Нәтиже:

Консоль шығысы:





Жоғарғы