Strtok

atmal
char * strtok(char * _String, const char * _Delimiter)

Funkcja ta zastępuje jakikolwiek znak z _Delimiter znaleziony w _String i zastępuje go \0.
Należy zauważyć, że funkcja przechowuje nasz ciąg znaków po jej wywołaniu w statycznej zmiennej. Oznacza to, że po pierwszym wywołaniu funkcji używamy NULL jako pierwszy parametr, tak aby funkcja użyła swojego wewnętrznego buforu.

Różnica pomiędzy strtok() a strtok_r()* jest taka, że ta druga nie korzysta ze statycznego bufora, przyjmuje wtedy ona 3 parametry:

char * strtok_r(char * _String, const char * _Delimiter, char** _Context)

*Na platformie Windows występuje jako strtok_s().
Gdzie _Context to pozostałość po przetworzonym ciągu.

Przykłady

Załóżmy, że posiadamy Alphabet Fonetyczny ICAO w zmiennej icaoAlphabet (dla uproszczenia użyto tylko 4 pierwszych kodów), lecz kody oddzielone są raz , , (spacją) albo .. Potrzebujemy wypisać te wszystkie kody, lecz nie wiemy jaki znak będzie użyty do oddzielenia i w jakim momencie.
W takim wypadku najlepiej użyć funkcji strtok().

int main()
{
    char icaoAlphabet[] = "alpha,bravo charlie.delta";
    char key[] = " ,."; // Tu przechowujemy znaki które mają zostać zamienione na \0

    char *code = strtok(icaoAlphabet, key);
    while(code) // Funkcja zwróci NULL jeżeli nie znajdzie kolejnego podciągu
    {
        cout << code << endl;
        code = strtok(NULL, key);
    }
    return 0;
}

Wynikiem powyższego kodu będzie

alpha
bravo
charlie
delta

W niektórych przypadkach strtok_r() może być lepszym rozwiązaniem, niż użycie strtok(). Na przykład, jeśli chcemy interpretować komendy i po znaku równości oczekujemy parametru możemy to zrobić tak:

int main()
{
    int x = 20; // Zmienna, którą będziemy zmieniać.
    char fullCommand[] = "VAR=53"; // Komenda
    char key[] = "="; // Tu przechowujemy znak który ma zostać zamieniony na \0

    cout << "Zmienna x=" << x << endl; // Wyświetlamy wartość zmiennej przed zmianą

    char* command; // Sama komenda. Po użyciu strtok_r() ta zmienna będzie miała wartość "VAR"
    char* param; // Parametr naszej komendy. Po użyciu w/w funkcji ta zmienna będzie miała wartość "53"

    command = strtok_r(fullCommand, key, &param); // Oddzielamy w pewnym sensie wartość od parametru
    if (command) // Jeżeli wskaźnik istnieje
    {
        if (!strcmp(command, "VAR")) // Porównujemy czy łańcuch command i "VAR" (nasza komenda) są takie same
        {
            x = atoi(param); // Konwertujemy tekst na liczbę i przypisujemy ją do zmiennej x
        }
    }
    cout << "Zmienna x=" << x << endl; //Znów wyświetlamy wartość zmiennej x
    return 0;
}

Powyższy kod wyświetli:

Zmienna x=20
Zmienna x=53

0 komentarzy