strtok, strtok_r - wydzielanie słów z
łańcuchów
Standardowa biblioteka C (
libc,
-lc)
#include <string.h>
char *strtok(char *restrict str, const char *restrict delim);
char *strtok_r(char *restrict str, const char *restrict delim,
char **restrict saveptr);
strtok_r():
_POSIX_C_SOURCE
|| /* glibc w wersji <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
Funkcja
strtok() dzieli łańcuch na
sekwencję zera lub więcej niepustych słów.
Przy pierwszym wywołaniu funkcji
strtok(), łańcuch
do przetworzenia powinien być podany w
str. W każdym
kolejnym wywołaniu, które powinno przetworzyć ten sam
łańcuch,
str musi być NULL.
Argument
delim określa zbiór bajtów
służących do oddzielania słów w
przetwarzanym łańcuchu. Program wywołujący
może podawać różne argumenty
delim w
kolejnych wywołaniach przetwarzających ten sam
łańcuch znaków.
Każde wywołanie funkcji
strtok() zwraca wskaźnik do
zakończonego znakiem null łańcuch zawierającego
następne słowo. Łańcuch ten nie zawiera znaku
separatora. Jeśli nie ma więcej słów, to
strtok() zwraca NULL.
Sekwencja wywołań
strtok() działająca na tym
samym łańcuchu znaków przechowuje wskaźnik
określający punkt, od którego należy szukać
kolejnego słowa. Pierwsze wywołanie
strtok() ustawia ten
wskaźnik na pierwszy bajt łańcucha. Początek
kolejnego słowa jest określany przez szukanie kolejnego bajtu
niebędącego ogranicznikiem w
str. Jeśli taki bajt
zostanie znaleziony, to jest uważany za początek kolejnego
słowa. Jeśli nie ma takiego bajtu, to nie ma więcej
słów i
strtok() zwraca NULL (Łańcuch,
który jest pusty, lub taki, który zawiera tylko znaki
ogranicznika, spowoduje, że pierwsze wywołanie
strtok()
także zwróci NULL).
The end of each token is found by scanning forward until either the next
delimiter byte is found or until the terminating null byte ('\0') is
encountered. If a delimiter byte is found, it is overwritten with a null byte
to terminate the current token, and
strtok() saves a pointer to the
following byte; that pointer will be used as the starting point when searching
for the next token. In this case,
strtok() returns a pointer to the
start of the found token.
Z powyższego opisu wynika, że sekwencja dwóch lub
więcej następujących po sobie bajtów ogranicznika
w przetwarzanym łańcuchu jest uważana za pojedynczy
ogranicznik i że ograniczniki na początku i końcu
łańcucha są zawsze ignorowane. Innymi słowy:
słowa zwracane przez
strtok() są zawsze niepustymi
łańcuchami znaków. Dlatego na przykład kolejne
wywołanie
strtok() dla łańcucha
"
aaa;;bbb," z łańcuchem ograniczników
"
;," zwrócą słowa "
aaa" oraz "
bbb", a następnie
zwrócą wskaźnik null.
The
strtok_r() function is a reentrant version of
strtok(). The
saveptr argument is a pointer to a
char * variable that
is used internally by
strtok_r() in order to maintain context between
successive calls that parse the same string.
On the first call to
strtok_r(),
str should point to the string to
be parsed, and the value of
*saveptr is ignored (but see NOTES). In
subsequent calls,
str should be NULL, and
saveptr (and the
buffer that it points to) should be unchanged since the previous call.
Różne łańcuchy znaków mogą być
przetwarzane równocześnie przy użyciu sekwencji
wywołań
strtok_r(), różniących
się argumentami
saveptr.
Funkcje
strtok() i
strtok_r() zwracają wskaźnik do
następnego słowa lub NULL, jeśli nie ma już
więcej słów.
Informacje o pojęciach używanych w tym rozdziale można
znaleźć w podręczniku
attributes(7).
Interfejs |
Atrybut |
Wartość |
strtok() |
Bezpieczeństwo wątkowe |
MT-Unsafe race:strtok |
strtok_r() |
Bezpieczeństwo wątkowe |
MT-Safe |
-
strtok()
- POSIX.1-2001, POSIX.1-2008, C99, SVr4, 4.3BSD.
-
strtok_r()
- POSIX.1-2001, POSIX.1-2008.
On some implementations,
*saveptr is required to be NULL on the first
call to
strtok_r() that is being used to parse
str.
Nigdy nie należy używać tych funkcji. Jeśli jednak
zostaną użyte, to należy zauważyć,
że:
- •
- Funkcje te modyfikują swój pierwszy
argument.
- •
- Funkcje ta nie mogą być stosowana z
ciągami stałymi.
- •
- Tożsamość bajtu separatora jest
tracona.
- •
- Funkcja strtok() korzysta ze statycznego bufora,
więc nie jest przystosowana do wielowątkowości.
Jeśli ma to znaczenie, należy używać
strtok_r().
Poniższy program używa zagnieżdżonych pętli,
stosując
strtok_r() do podzielenia łańcucha na
dwupoziomową hierarchię słów. Pierwszy argument
linii poleceń określa łańcuch do przetworzenia.
Drugi argument podaje bajty ograniczające używane do dzielenia
łańcucha na "główne" słowa.
Trzeci argument określa bajty służące do dzielenia
"głównych" słów na podsłowa.
Przykładowe wyjście programu jest następujące:
$ ./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, "Użycie: %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("\t --> %s\n", subtoken);
}
}
exit(EXIT_SUCCESS);
}
Inny przykładowy program używający
strtok()
można znaleźć w
getaddrinfo_a(3).
memchr(3),
strchr(3),
string(3),
strpbrk(3),
strsep(3),
strspn(3),
strstr(3),
wcstok(3)
Autorami polskiego tłumaczenia niniejszej strony podręcznika
są: Paweł Wilk <
[email protected]>, Andrzej
Krzysztofowicz <
[email protected]>, Robert Luberda
<
[email protected]> i Michał Kułach
<
[email protected]>
Niniejsze tłumaczenie jest wolną dokumentacją.
Bliższe informacje o warunkach licencji można uzyskać
zapoznając się z
GNU
General Public License w wersji 3 lub nowszej. Nie przyjmuje się
ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy
zgłaszać na adres listy dyskusyjnej
[email protected]