table of contents
STRTOK(3) | Руководство программиста Linux | STRTOK(3) |
ИМЯ¶
strtok, strtok_r - извлечение элементов (токенов) из строки
ОБЗОР¶
#include <string.h> char *strtok(char *str, const char *delim); char *strtok_r(char *str, const char *delim, char **saveptr);
Требования
макроса
тестирования
свойств
для glibc (см.
feature_test_macros(7)):
strtok_r(): _SVID_SOURCE || _BSD_SOURCE || _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
ОПИСАНИЕ¶
Функция strtok() разделяет строку на последовательность токенов. При первом вызове strtok() анализируемую строку нужно указывать в аргументе str. В каждом последующем вызове, в котором анализируется эта же строка, значение str должно быть NULL.
В аргументе delim задаётся набор байт, которые считаются разделителями токенов в анализируемой строке. Вызывающий может указывать разные строки в delim в последующих вызовах при анализе той же строки.
Каждый вызов strtok() возвращает указатель на строку, завершающуюся null, которая содержит следующий токен. Эта строка не включает байт-разделитель. Если больше токенов нет, то strtok() возвращает NULL.
Последовательность двух и более смежных байтов-разделителей в анализируемой строке считается одним разделителем. Байты-разделители в начале или в конце строки игнорируются. Другими словами: токены, возвращаемые strtok(), всегда являются непустыми строками.
Функция strtok_r() является реентерабельной версией strtok(). Аргумент saveptr является указателем на переменную char *, которая используется внутри strtok_r() для учёта контекста между последующими вызовами при анализе одной и той же строки.
При первом вызове strtok_r() значение str должно указывать на анализируемую строку, а значение saveptr игнорируется. При последующих вызовах значение str должно быть NULL, а значение saveptr не должно изменяться с момента предыдущего вызова.
Одновременно могут анализироваться разные строки при нескольких запусках strtok_r() с различными аргументами saveptr.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
Функции strtok() и strtok_r() возвращают указатель на следующий токен или NULL, если больше токенов нет.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
- strtok()
- SVr4, POSIX.1-2001, 4.3BSD, C89, C99.
- strtok_r()
- POSIX.1-2001.
ДЕФЕКТЫ¶
Используйте данные функции с осторожностью. Учитывайте, что:
- Эти функции изменяют свой первый аргумент.
- Эти функции не могут использоваться со строками-константами.
- Теряется идентичность байта-разделителя.
- При анализе функция strtok() использует статический буфер, поэтому не является безопасной для нитей. Используйте strtok_r() в этом случае.
ПРИМЕР¶
В программе, представленной далее, используются вложенные циклы, которые вызывают strtok_r() для разделения строки на составляющие её токены. В первом параметре командной строки задаётся анализируемая строка. Во втором параметре задаётся байт(ы)- разделитель, который используется для деления строки на «составные» токены. В третьем параметре указывается байт(ы)- разделитель, который используется для разделения «составных» токенов на подтокены.
Пример результата вывода программы:
$ ./a.out 'a/bbb///cc;xxx:yyy:' ':;' '/' 1: a/bbb///cc
--> a
--> bbb
--> cc 2: xxx
--> xxx 3: yyy
--> yyy
Исходный код программы¶
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) {
char *str1, *str2, *token, *subtoken;
char *saveptr1, *saveptr2;
int j;
if (argc != 4) {
fprintf(stderr, "Использование: %s string delim subdelim\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, token);
for (str2 = token; ; str2 = NULL) {
subtoken = strtok_r(str2, argv[3], &saveptr2);
if (subtoken == NULL)
break;
printf(" --> %s\n", subtoken);
}
}
exit(EXIT_SUCCESS); }
Ещё один пример программы, использующей strtok(), можно найти в getaddrinfo_a(3).
СМОТРИТЕ ТАКЖЕ¶
index(3), memchr(3), rindex(3), strchr(3), string(3), strpbrk(3), strsep(3), strspn(3), strstr(3), wcstok(3)
2012-05-10 | GNU |