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