Để hiểu cách strtok()
hoạt động, trước tiên, người ta cần biết biến tĩnh là gì. Liên kết này giải thích nó khá tốt ....
Chìa khóa cho hoạt động của strtok()
là bảo toàn vị trí của trình phân tách cuối cùng giữa các cuộc gọi bảo mật (đó là lý do tại sao strtok()
tiếp tục phân tích cú pháp chuỗi ban đầu được chuyển đến nó khi nó được gọi bằng một null pointer
trong các cuộc gọi liên tiếp) ..
Hãy xem cách strtok()
triển khai của riêng tôi , được gọi là zStrtok()
, có chức năng hoàn toàn khác với chức năng được cung cấp bởistrtok()
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;
}
Và đây là một ví dụ sử dụng
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)
Mã là từ một thư viện xử lý chuỗi mà tôi duy trì trên Github , được gọi là zString. Hãy xem mã, hoặc thậm chí đóng góp :)
https://github.com/fnoyanisi/zString
strtok()
sửa đổi chuỗi đối số của nó bằng cách kết thúc mã thông báo bằng NUL trước khi trả về. Nếu bạn cố gắng kiểm tra toàn bộ vùng đệm (str []), bạn sẽ thấy nó được sửa đổi giữa các lần gọi liên tiếp tớistrtok()
.