.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2005, 2013 Michael Kerrisk .\" a few fragments from an earlier (1996) version by .\" Andries Brouwer (aeb@cwi.nl) remain. .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Rewritten old page, 960210, aeb@cwi.nl .\" Updated, added strtok_r. 2000-02-13 Nicolás Lichtmaier .\" 2005-11-17, mtk: Substantial parts rewritten .\" 2013-05-19, mtk: added much further detail on the operation of strtok() .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH STRTOK 3 "1 ноября 2020 г." GNU "Руководство программиста Linux" .SH ИМЯ strtok, strtok_r \- извлечение элементов (токенов) из строки .SH СИНТАКСИС .nf \fB#include \fP .PP \fBchar *strtok(char *\fP\fIstr\fP\fB, const char *\fP\fIdelim\fP\fB);\fP .PP \fBchar *strtok_r(char *\fP\fIstr\fP\fB, const char *\fP\fIdelim\fP\fB, char **\fP\fIsaveptr\fP\fB);\fP .fi .PP .RS -4 Требования макроса тестирования свойств для glibc (см. \fBfeature_test_macros\fP(7)): .RE .PP .ad l \fBstrtok_r\fP(): _POSIX_C_SOURCE || /* в версии glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE .ad b .SH ОПИСАНИЕ Функция \fBstrtok\fP() разделяет строку на последовательность нуля или более непустых токенов. При первом вызове \fBstrtok\fP() анализируемую строку нужно указывать в аргументе \fIstr\fP. В каждом последующем вызове, в котором анализируется эта же строка, значение \fIstr\fP должно быть NULL. .PP В аргументе \fIdelim\fP задаётся набор байт, которые считаются разделителями токенов в анализируемой строке. Вызывающий может указывать разные строки в \fIdelim\fP в последующих вызовах при анализе той же строки. .PP Каждый вызов \fBstrtok\fP() возвращает указатель на строку, завершающуюся null, которая содержит следующий токен. Эта строка не включает байт\-разделитель. Если больше токенов нет, то \fBstrtok\fP() возвращает NULL. .PP Последовательность вызовов \fBstrtok\fP(), оперирующих одной строкой, поддерживает указатель, который определяет точку, с которой начинается поиск следующего токена. Первый вызов \fBstrtok\fP() назначает этому указателю ссылку на первый байт строки. Начало следующего токена определяется поиском вперёд в \fIstr\fP следующего байта не разделителя. Если байт найден, то он берётся в качестве начала следующего токена. Если такой байт не найден, то токенов больше нет и \fBstrtok\fP() возвращает NULL (для пустой строки или состоящей только из разделителей в этом случае NULL вернётся при первом вызове \fBstrtok\fP()). .PP Конец каждого токена находится поиском вперёд, длящемся до тех пор, пока не будет найден байт\-разделитель или завершающий байт null (\(aq\e0\(aq). Если найден байт\-разделитель, то он заменяется байтом null для завершения текущего токена, и \fBstrtok\fP() сохраняет указатель на следующий байт; этот указатель будет использован в качестве начальной точки при поиске следующего токена. В этом случае \fBstrtok\fP() возвращает указатель на начало найденного токена. .PP Из описания выше следует, что последовательность из двух и более непрерывных байтов\-разделителей в просматриваемой строке считается одним разделителем, а байты\-разделители в начале или конце строки игнорируются. Другими словами, токены, возвращаемые \fBstrtok\fP() — всегда не пустые строки. То есть, например, если есть строка «\fIaaa;;bbb,\fP», то последующие вызовы \fBstrtok\fP() с заданными разделителями строк «\fI;,\fP» вернули бы строки «\fIaaa\fP» и «\fIbbb\fP», а затем указатель null. .PP The \fBstrtok_r\fP() function is a reentrant version of \fBstrtok\fP(). The \fIsaveptr\fP argument is a pointer to a \fIchar\ *\fP variable that is used internally by \fBstrtok_r\fP() in order to maintain context between successive calls that parse the same string. .PP При первом вызове \fBstrtok_r\fP() значение \fIstr\fP должно указывать на анализируемую строку, а значение \fI*saveptr\fP игнорируется (но смотрите ЗАМЕЧАНИЯ). При последующих вызовах значение \fIstr\fP должно быть NULL, а значение \fIsaveptr\fP (и буфер, на который оно указывает) не должно изменяться с момента предыдущего вызова. .PP Одновременно могут анализироваться разные строки при нескольких запусках \fBstrtok_r\fP() с различными аргументами \fIsaveptr\fP. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" Функции \fBstrtok\fP() и \fBstrtok_r\fP() возвращают указатель на следующий токен или NULL, если больше токенов нет. .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lb lb lb l l l. Интерфейс Атрибут Значение T{ \fBstrtok\fP() T} Безвредность в нитях MT\-Unsafe race:strtok T{ \fBstrtok_r\fP() T} Безвредность в нитях MT\-Safe .TE .SH "СООТВЕТСТВИЕ СТАНДАРТАМ" .TP \fBstrtok\fP() POSIX.1\-2001, POSIX.1\-2008, C89, C99, SVr4, 4.3BSD. .TP \fBstrtok_r\fP() POSIX.1\-2001, POSIX.1\-2008. .SH ЗАМЕЧАНИЯ .\" Tru64, according to its manual page В некоторых реализациях значение \fI*saveptr\fP должно быть равно NULL при первом вызове \fBstrtok_r\fP(), который используется для разбора \fIstr\fP. .SH ДЕФЕКТЫ Используйте данные функции с осторожностью. Учитывайте, что: .IP * 2 Эти функции изменяют свой первый аргумент. .IP * Эти функции не могут использоваться со строками\-константами. .IP * Теряется идентичность байта\-разделителя. .IP * При анализе функция \fBstrtok\fP() использует статический буфер, поэтому не является безопасной для нитей. Используйте \fBstrtok_r\fP() в этом случае. .SH ПРИМЕРЫ В программе, представленной далее, используются вложенные циклы, которые вызывают \fBstrtok_r\fP() для разделения строки на составляющие её токены. В первом параметре командной строки задаётся анализируемая строка. Во втором параметре задаётся байт(ы)\- разделитель, который используется для деления строки на «составные» токены. В третьем параметре указывается байт(ы)\- разделитель, который используется для разделения «составных» токенов на подтокены. .PP Пример результата вывода программы: .PP .in +4n .EX $\fB ./a.out \(aqa/bbb///cc;xxx:yyy:\(aq \(aq:;\(aq \(aq/\(aq\fP 1: a/bbb///cc \-\-> a \-\-> bbb \-\-> cc 2: xxx \-\-> xxx 3: yyy \-\-> yyy .EE .in .SS "Исходный код программы" \& .EX #include #include #include int main(int argc, char *argv[]) { char *str1, *str2, *token, *subtoken; char *saveptr1, *saveptr2; if (argc != 4) { fprintf(stderr, "Использование: %s string delim subdelim\en", argv[0]); exit(EXIT_FAILURE); } for (int j = 1, str1 = argv[1]; ; j++, str1 = NULL) { token = strtok_r(str1, argv[2], &saveptr1); if (token == NULL) break; printf("%d: %s\en", j, token); for (str2 = token; ; str2 = NULL) { subtoken = strtok_r(str2, argv[3], &saveptr2); if (subtoken == NULL) break; printf("\t \-\-> %s\en", subtoken); } } exit(EXIT_SUCCESS); } .EE .PP Ещё один пример программы, использующей \fBstrtok\fP(), можно найти в \fBgetaddrinfo_a\fP(3). .SH "СМ. ТАКЖЕ" \fBindex\fP(3), \fBmemchr\fP(3), \fBrindex\fP(3), \fBstrchr\fP(3), \fBstring\fP(3), \fBstrpbrk\fP(3), \fBstrsep\fP(3), \fBstrspn\fP(3), \fBstrstr\fP(3), \fBwcstok\fP(3) .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Alexander Golubev , Azamat Hackimov , Hotellook, Nikita , Spiros Georgaras , Vladislav , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .