Nasıl strtok()
çalıştığını anlamak için önce statik değişkenin ne olduğunu bilmek gerekir . Bu bağlantı bunu oldukça iyi açıklıyor ...
Çalışması için anahtar strtok()
seccessive çağrılar arasında geçen seperatörü konumunu muhafaza etmektedir (işte bu yüzden strtok()
bir çalıştırıldığında kendisine iletilen çok orijinal dize ayrıştırmak devam null pointer
izleyen aramalar) ..
Tarafından sağlanandan biraz farklı bir işlevselliğe sahip olan kendi strtok()
uygulamama bir göz atın zStrtok()
.strtok()
char *zStrtok(char *str, const char *delim) {
static char *static_str=0; /* var to store last address */
int index=0, strlength=0; /* integers for indexes */
int found = 0; /* check if delim is found */
/* delimiter cannot be NULL
* if no more char left, return NULL as well
*/
if (delim==0 || (str == 0 && static_str == 0))
return 0;
if (str == 0)
str = static_str;
/* get length of string */
while(str[strlength])
strlength++;
/* find the first occurance of delim */
for (index=0;index<strlength;index++)
if (str[index]==delim[0]) {
found=1;
break;
}
/* if delim is not contained in str, return str */
if (!found) {
static_str = 0;
return str;
}
/* check for consecutive delimiters
*if first char is delim, return delim
*/
if (str[0]==delim[0]) {
static_str = (str + 1);
return (char *)delim;
}
/* terminate the string
* this assignmetn requires char[], so str has to
* be char[] rather than *char
*/
str[index] = '\0';
/* save the rest of the string */
if ((str + index + 1)!=0)
static_str = (str + index + 1);
else
static_str = 0;
return str;
}
Ve işte örnek bir kullanım
Example Usage
char str[] = "A,B,,,C";
printf("1 %s\n",zStrtok(s,","));
printf("2 %s\n",zStrtok(NULL,","));
printf("3 %s\n",zStrtok(NULL,","));
printf("4 %s\n",zStrtok(NULL,","));
printf("5 %s\n",zStrtok(NULL,","));
printf("6 %s\n",zStrtok(NULL,","));
Example Output
1 A
2 B
3 ,
4 ,
5 C
6 (null)
Kod, Github'da tuttuğum zString adlı bir dizi işleme kitaplığından . Kodu inceleyin, hatta katkıda bulunun :)
https://github.com/fnoyanisi/zString
strtok()
dönmeden önce belirteçleri NUL ile sonlandırarak argüman dizesini değiştirir. Tüm tamponu (str []) incelemeye çalışırsanız, ardı ardına yapılan aramalar arasında değiştirildiğini görürsünüzstrtok()
.