Provided by: manpages-pl-dev_4.13-4_all bug

NAZWA

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

SKŁADNIA

       #include <string.h>

       char *strtok(char *str, const char *delim);

       char *strtok_r(char *str, const char *delim, char **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).

       Koniec każdego słowa jest określany przez wyszukanie albo  następnego  bajtu  ogranicznika
       albo napotkanie kończącego bajtu null ('\0'). Jeśli zostanie znaleziony bajt ogranicznika,
       to jest nadpisywany znakiem null, tak aby zakończyć bieżące słowo,  a  strtok()  zachowuje
       wskaźnik  do  kolejnego  bajtu; wskaźnik ten będzie użyty jako punkt startowy wyszukiwania
       kolejnego słowa. W takim przypadku  strtok()  zwraca  wskaźnik  do  początku  znalezionego
       słowa.

       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               │
       └───────────┴────────────────────────┴───────────────────────┘

ZGODNE Z

       strtok()
              POSIX.1-2001, POSIX.1-2008, C89, 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;

           if (argc != 4) {
               fprintf(stderr, "Użycie: %s string delim subdelim\n",
                       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\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);
       }

       Inny przykładowy program używający strtok() można znaleźć w getaddrinfo_a(3).

ZOBACZ TAKŻE

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

O STRONIE

       Angielska  wersja  tej  strony  pochodzi  z  wydania  5.10  projektu Linux man-pages. Opis
       projektu, informacje dotyczące zgłaszania błędów oraz  najnowszą  wersję  oryginału  można
       znaleźć pod adresem https://www.kernel.org/doc/man-pages/.

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⟩.