Provided by: manpages-pl-dev_4.21.0-2_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   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.

Linux man-pages 6.03                            5 lutego 2023 r.                                       strtok(3)