Щоб зрозуміти, як strtok()
працює, спочатку потрібно знати, що таке статична змінна . Це посилання пояснює це досить добре ....
Ключовим фактором операції strtok()
є збереження місця розташування останнього сепаратора між сесійними викликами (саме тому strtok()
продовжується розбір тієї самої оригінальної рядки, яка передається їй, коли вона викликається null pointer
послідовними дзвінками).
Погляньте на мою власну strtok()
реалізацію, яка називається 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;
}
І ось приклад використання
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)
Код з бібліотеки обробки рядків, яку я підтримую в Github , називається zString. Подивіться на код або навіть внесіть внесок :)
https://github.com/fnoyanisi/zString
strtok()
змінює свій рядок аргументу, припиняючи лексеми NUL перед поверненням. Якщо ви спробуєте вивчити весь буфер (str []), ви побачите, що він змінюється між послідовними викликами наstrtok()
.