Bildirim
char* strtok(char *str, const char *delim);
char* strtok(char *restrict str, const char *restrict delim); (C99)
errno_t strtok_s(char *restrict str, rsize_t strmax, const char *restrict delim, char **restrict ptr); (C11)
Açıklama
Delim parametresi ile gösterilen karakter dizisi içindeki sınırlayıcı karakterleri kullanarak str parametresi ile gösterilen karakter dizisini parçalara ayırır.
Farklı bir ifade ile, str parametresi ile gösterilen karakter dizisi içinde delim parametresi ile gösterilen karakterleri göz ardı ederek, kalan karakterleri diziler halinde ayırır.
Fonksiyon önce, str parametresi ile çağrılır. Sonra, bir döngü içinde, karakter dizinin sonu gelene kadar, NULL bir değer ile tekrar tekrar çağrılır.
strtok_s() fonksiyonu ayrıca, her adımda (fonksiyonun her çağrılmasında), str parametresinde işlem yapılmak üzere kalan karakter sayısını strmax parametresine ve fonksiyonun dahili durumunu ptr parametresine yazar. Fonksiyonun tekrar çağrılarında (NULL değer ile), strmax ve ptr parametrelerine bir önceki çağrı tarafından kaydedilen değerler aktarılmalıdır.
Aşağıdaki hatalar çalışma zamanında algılandığında, ptr ile gösterilen parametreye herhangi bir değer kaydetmeden, yüklenmiş olan kısıtlayıcı işlem fonksiyonu çağrılır:
Eğer str karakter dizisi boş bir karakter ile sonlandırılmamış ise veya strmax değeri karakter dizisinin boyutundan daha büyük ise sonuç belirsiz olur.
Parametreler
src: Alt dizilere ayrılacak olan boş bir karakter ('\0') ile sonlandırılmış bir karakter dizisidir.
delim: Sınırlayıcı byte değerlerini içeren boş bir karakter ('\0') ile sonlandırılmış bir karakter dizisidir.
strmax: Fonksiyonun ilk çalışmasında str parametresinin boyutunu içeren değerdir. Strtok_s() fonksiyonu bu parametreye işlem yapılacak kalan karakter sayısını yükler.
ptr: Strtok_s() fonksiyonunun dahili durumunu yüklemek için kullandığı char* veri türünden bir işaretçidir.
Dönüş değeri
Bir sonraki alt dizinin başlangıcını gösteren bir işaretçi geri döndürür. Eğer alt dizin yoksa NULL bir işaretçi geri döndürür.
Örnek
#include <stdio.h>
#include <string.h>
int main(void)
{
char cdizi[] = "&Bilgisayar & ve & Programlama & Dilleri";
const char *delp;
printf("Karakter dizisi: %s\n", cdizi);
/* Sınırlayıcı karakterlerin bulunduğu dizindeki karakterlerden herhangi
birinin bulunmadığı ilk karakterin bellek adresini geri döndürür. */
delp = strtok(cdizi, " &");
printf("Sınırlayıcı karakter içermeyen ilk karakterin adresi: %p, dizi: %s\n", delp, delp);
while (delp != NULL) {
printf("%s\n", delp);
delp = strtok(NULL, " &");
}
return 0;
}
Yukarıdaki örnekte, program aşağıdaki satırları ekrana yazar.
Karakter dizisi: &Bilgisayar & ve & Programlama & Dilleri Sınırlayıcı karakter içermeyen ilk karakterin adresi: 0060FED4, dizi: Bilgisayar Bilgisayar ve Programlama Dilleri
Program bir karakter dizisinin içeriğini diğer bir karakter dizisinin sonuna strcat() fonksiyonu ile ekledikten sonra elde edilen yeni karakter dizisini ekrana yazar.
Kaynak kodu
Copyright Public domain
char* strtok(char *str, const char *delim)
{
static char* p=0;
if(str)
p=str;
else if(!p)
return 0;
str = p+strspn(p,delim);
p = str+strcspn(str,delim);
if(p==str)
return p=0;
p = *p ? p+1 : 0;
return str;
}