Aby zrozumieć, jak strtok()
działa, należy najpierw wiedzieć, czym jest zmienna statyczna . Ten link wyjaśnia to całkiem dobrze ....
Kluczem do działania strtok()
jest zachowanie lokalizacji ostatniego separatora między kolejnymi wywołaniami (dlatego strtok()
kontynuuje analizowanie bardzo oryginalnego ciągu, który jest do niego przekazywany, gdy jest wywoływany za pomocą a null pointer
w kolejnych wywołaniach).
Przyjrzyj się mojej własnej strtok()
implementacji, tzw. zStrtok()
, Która ma odrobinę inną funkcjonalność niż ta dostarczona przezstrtok()
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;
}
A oto przykład użycia
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 pochodzi z biblioteki przetwarzającej ciągi, którą prowadzę na Github , zwanej zString. Spójrz na kod, a nawet pomóż :)
https://github.com/fnoyanisi/zString
strtok()
modyfikuje swój argument, kończąc tokeny z wartością NUL przed zwróceniem. Jeśli spróbujesz zbadać cały bufor (str []), zobaczysz, że jest on modyfikowany między kolejnymi wywołaniami funkcjistrtok()
.