思路:每次在原来字符串中查找分隔字符串,将分隔字符串中所有字符设为'\0',然后输出分隔串前的子串,同时更新原串的起始位置。
PS:有不少博客作者自己实现的方法中往往只将分隔串当做一个字符,实际上可以是一个字符串,这点需要注意
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 char* my_strtok(char* str, const char *delimit)
6 {
7 static char* tmp = NULL;
8 char *ret = NULL;
9 if(delimit == NULL) return str;
10 if(str != NULL)
11 tmp = str;
12 if(tmp == NULL) return NULL;
13 ret = tmp;
14 char *p = strstr(tmp, delimit);
15 if(p != NULL)
16 {
17 tmp = p + strlen(delimit);//tmp要更新为下次的起始点
18 int i;
19 for(i = 0; i < strlen(delimit);i++)//将原串中的分隔符字符串都设置为'\0',保证输出ret时,只输出第一段,达到分割的效果
20 {
21 *(p + i) = '\0';
22 }
23 } else { //分隔符无法对剩下的字符串进行分割了
24 tmp = NULL; //下次调用将直接返回NULL
25 }
26 return ret;
27 }
28
29
30 int main()
31 {
32 char str[] = "aabbccddcceeff";
33 char str2[] = "aabbccddcceeff";
34
35 puts("Output from strtok:");
36 char * ret = strtok(str, "cc");
37 while(ret != NULL)
38 {
39 puts(ret);
40 ret = strtok(NULL, "cc");
41 }
42
43 puts("Output from my_strtok:");
44 char * ans = my_strtok(str2, "cc");
45 while(ans != NULL)
46 {
47 puts(ans);
48 ans = my_strtok(NULL, "cc");
49 }
50
51 return 0;
52 }
测试输出如下: