Provided by: manpages-pl-dev_4.18.1-1_all bug

NAZWA

       strtok, strtok_r - wydzielanie słów z łańcuchów

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #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);

   Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

       strtok_r():
           _POSIX_C_SOURCE
               || /* glibc w wersji <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

OPIS

       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.

WARTOŚĆ ZWRACANA

       Funkcje strtok() i strtok_r() zwracają wskaźnik do następnego słowa lub NULL, jeśli nie ma
       już więcej słów.

ATRYBUTY

       Informacje   o   pojęciach   używanych   w  tym  rozdziale  można  znaleźć  w  podręczniku
       attributes(7).

       ┌────────────────────────────────────────┬────────────────────────┬───────────────────────┐
       │InterfejsAtrybutWartość               │
       ├────────────────────────────────────────┼────────────────────────┼───────────────────────┤
       │strtok()                                │ Bezpieczeństwo wątkowe │ MT-Unsafe race:strtok │
       ├────────────────────────────────────────┼────────────────────────┼───────────────────────┤
       │strtok_r()                              │ Bezpieczeństwo wątkowe │ MT-Safe               │
       └────────────────────────────────────────┴────────────────────────┴───────────────────────┘

STANDARDY

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

       strtok_r()
              POSIX.1-2001, POSIX.1-2008.

UWAGI

       On some implementations, *saveptr is required to be NULL on the first call  to  strtok_r()
       that is being used to parse str.

BŁĘDY

       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().

PRZYKŁADY

       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

   Kod źródłowy programu

       #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).

ZOBACZ TAKŻE

       memchr(3), strchr(3), string(3), strpbrk(3), strsep(3), strspn(3), strstr(3), wcstok(3)

TŁUMACZENIE

       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
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  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⟩.