关于strtok()函数的使用这里,遇到了一个不理解的问题
代码如图所示
str1 str2字符串的定义缺了[] ,修改如下:
char str1[] = "abc;def;ghi"; //char str1 = "abc;def;ghi";
char str2[] = "jkl;nno;pqr"; //char str2 = "jkl;nno;pqr";
str1和str2定义为单个字符,单个字符是用单引号而不是双引号哦!双引号定义的是字符串!
/********************************************************************
功能:根据设置的分隔符对字符串进行分割,代码还需优化,敬请期待。。。。
时间:2020-7-9
********************************************************************/
#include <stdio.h>
char *strtok_pro(char *str,const char *delim,char **last);
char *my_strtok(char *str,const char *delim);
int main(int argc,const char **argv)
{
char str[50] = "hello/world-zhang-HE$LLO/LLLLLL-GGGGGG";
printf("%s\n",my_strtok(str,"/-"));
char *p;
while((p = my_strtok(NULL,"/-$")) != NULL)
{
printf("%s\n",p);
}
printf("string done\n");
return 0;
}
/*
调用函数
*/
char *my_strtok(char *str,const char *delim)
{
static char *last; //设置一个静态指针来保存分隔符下一个元素的地址
return strtok_pro(str,delim,&last);
}
/*
根据C语言中源代码中原型,本算法分开两种情况进行判断(非NULL和NULL),
*/
char *strtok_pro(char *str,const char *delim,char **last)
{
char *cp_str;
const char *cp_delim;
if(str != NULL) //判断是否到达字符串末尾
{
for(cp_str=str;*cp_str++ != '\0';)
{
//printf("%2c",*cp_str);
for(cp_delim=delim;*cp_delim++ != '\0';)
{
if(*(cp_str-1) == *(cp_delim-1)) //判断是否相等
{
*(cp_str-1) = '\0'; //把分隔符替换为'\0'
if(*cp_str != '\0') //判断下一位是否为结束符
{
*last = cp_str;
}
else
{
*last = NULL;
}
return str;
}
}
}
*last = NULL;
return NULL;
}
else if(str == NULL)
{
if(*last == NULL) //判断是否都同时NULL
{
return NULL;
}
char *mid_str = *last;
for(cp_str = *last;*cp_str++ != '\0';)
{
for(cp_delim = delim;*cp_delim++ != '\0';)
{
if(*(cp_str-1) == *(cp_delim-1))
{
*(cp_str-1) = '\0';
if(cp_str != '\0')
{
*last = cp_str;
}
else
{
*last = NULL;
}
return mid_str;
}
}
}
*last = NULL; //这里需要及时标记为空,否则会一直判断不出结束
return mid_str; //没有找到及时返回最后一节字符串的首元素地址
}
}