#include <stdio.h>
//字符串比较函数,两个字符串相同就返回1,否则返回0
static int my_strcmp( const char *dest, const char *src, int len)
{
int i;
for(i = 0;i < len; i++)
{
if(src[i] != dest[i])
{
return(0);
}
}
return(1);
}
char *my_strtok(char *str, const char *delim)
{
int i = 0;
int len = strlen(delim);
char *ret_p;
char *temp; //临时变量,用来遍历字符串str
static char *save_p; //静态变量用来保存上一次返回地址
temp = (str == NULL) ? save_p : str;//如果是第一次使用,则从字符串首地址开始查找,否则从上一次返回的地点开始查找
ret_p = temp; //需要返回的地址
if(1 == len) //如果delim只有一个字符,就直接比较,不需调用 my_strcmp函数
{
/*****************************************/
while(*temp != '\0')
{
if(*delim == *temp)
{
*temp = '\0'; //将字符串从此处"剪断"
save_p = ++temp;
return(ret_p);
}
temp++;
}
// return(NULL);
}
else //如果delim有多个个字符,就my_strcmp函数, 这样代码简单
{
/******************************************/
while(*temp != '\0')
{
if(my_strcmp(temp,delim,len) == 1)
{
*temp = '\0';
save_p = temp + len;
return(ret_p);
}
temp++;
}
}
return(NULL); //没找到匹配字符或字符串时返回NULL
}
int main()
{
#if 0
char src[] = "2016//05//20 11::19::32 \0";
char *str = my_strtok(src,"//");
printf("%s\n",str);//2016
str = my_strtok(NULL,"//");
printf("%s\n",str);//05
str = my_strtok(NULL," ");
printf("%s\n",str);//20
str = my_strtok(NULL,"::");
printf("%s\n",str);//11
str = my_strtok(NULL,"::");
printf("%s\n",str);//19
str = my_strtok(NULL," ");
printf("%s\n",str);
#else
char src[]="2016/05/20 11:19:32 \0";
char *str = my_strtok(src,"/");
printf("%s\n",str);//2016
str = my_strtok(NULL,"/");
printf("%s\n",str);//05
str = my_strtok(NULL," ");
printf("%s\n",str);//20
str = my_strtok(NULL,":");
printf("%s\n",str);//11
str = my_strtok(NULL,":");
printf("%s\n",str);//19
str = my_strtok(NULL," ");
printf("%s\n",str);
#endif
return(0);
//字符串比较函数,两个字符串相同就返回1,否则返回0
static int my_strcmp( const char *dest, const char *src, int len)
{
int i;
for(i = 0;i < len; i++)
{
if(src[i] != dest[i])
{
return(0);
}
}
return(1);
}
char *my_strtok(char *str, const char *delim)
{
int i = 0;
int len = strlen(delim);
char *ret_p;
char *temp; //临时变量,用来遍历字符串str
static char *save_p; //静态变量用来保存上一次返回地址
temp = (str == NULL) ? save_p : str;//如果是第一次使用,则从字符串首地址开始查找,否则从上一次返回的地点开始查找
ret_p = temp; //需要返回的地址
if(1 == len) //如果delim只有一个字符,就直接比较,不需调用 my_strcmp函数
{
/*****************************************/
while(*temp != '\0')
{
if(*delim == *temp)
{
*temp = '\0'; //将字符串从此处"剪断"
save_p = ++temp;
return(ret_p);
}
temp++;
}
// return(NULL);
}
else //如果delim有多个个字符,就my_strcmp函数, 这样代码简单
{
/******************************************/
while(*temp != '\0')
{
if(my_strcmp(temp,delim,len) == 1)
{
*temp = '\0';
save_p = temp + len;
return(ret_p);
}
temp++;
}
}
return(NULL); //没找到匹配字符或字符串时返回NULL
}
int main()
{
#if 0
char src[] = "2016//05//20 11::19::32 \0";
char *str = my_strtok(src,"//");
printf("%s\n",str);//2016
str = my_strtok(NULL,"//");
printf("%s\n",str);//05
str = my_strtok(NULL," ");
printf("%s\n",str);//20
str = my_strtok(NULL,"::");
printf("%s\n",str);//11
str = my_strtok(NULL,"::");
printf("%s\n",str);//19
str = my_strtok(NULL," ");
printf("%s\n",str);
#else
char src[]="2016/05/20 11:19:32 \0";
char *str = my_strtok(src,"/");
printf("%s\n",str);//2016
str = my_strtok(NULL,"/");
printf("%s\n",str);//05
str = my_strtok(NULL," ");
printf("%s\n",str);//20
str = my_strtok(NULL,":");
printf("%s\n",str);//11
str = my_strtok(NULL,":");
printf("%s\n",str);//19
str = my_strtok(NULL," ");
printf("%s\n",str);
#endif
return(0);
}
函数运行结果是在屏幕上打印
2016
05
20
11
19
32
函数的功能是在字符串str中查找delim字符串,找到后把第一个匹配的字符换成'\0',并且返回一个指向一开始查找的字符的地址,
如 char *str="1234567"; char *delim = "5";函数在str中找到'5'后,将'5'换成‘\0’,返回'1'的地址.,在返回前,将'6'的地址保存在
静态的 局部指针 save_p 中,下次调用strtok函数时从 save_p 指向的地址开始查找字符串。第一次调用strtok函数时需要传入一个
地址给 str,之后调用时传NULL给str。