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, ¶m); // 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