Provided by: manpages-pl-dev_0.7-1_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.

       Funkcja strtok_r() jest wielowątkową wersją  strtok(). Argument saveptr jest wskaźnikiem do zmiennej typu
       char *, używanej wewnętrznie przez strtok_r() do  zachowania  kontekstu  pomiędzy  kolejnymi  wywołaniami
       przetwarzającymi ten sam łańcuch znaków.

       Podczas  pierwszego  wywołania  strtok_r() argument str powinien wskazywać na łańcuch do przetworzenia, a
       wartość saveptr jest ignorowana. W kolejnych wywołaniach str powinien  być  równy  NULL,  a  saveptr  nie
       powinien być zmieniony od poprzedniego wywołania.

       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.

BŁĘDY IMPLEMENTACJI

       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ŁAD

       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

   Żródło 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(" --> %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 4.07 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   man   są:   Paweł   Wilk   (PTM)
       <siewca@dione.ids.pl>,    Andrzej    Krzysztofowicz    (PTM)    <ankry@mif.pg.gda.pl>,   Robert   Luberda
       <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>.

       Polskie tłumaczenie jest częścią  projektu  manpages-pl;  uwagi,  pomoc,  zgłaszanie  błędów  na  stronie
       http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją  4.07 oryginału.