strtok(3) | Library Functions Manual | strtok(3) |
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 |
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:
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 <siefca@pl.qmail.org>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>
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 manpages-pl-list@lists.sourceforge.net.
5 lutego 2023 r. | Linux man-pages 6.03 |