自己实现strtok函数
思路:每次在原来字符串中查找分隔字符串,将分隔字符串中所有字符设为'\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 }
测试输出如下: