尝试实现strtok函数的功能
char* my_strtok(char* strcpy, char* sep)
{
static char* p = NULL;
int flag = 1; //立个flag方便记录分割后有效内容字符的首地址
char* temp = NULL;//申请个返回的指针变量temp
const char* fsep = sep;//给sep复制一个常变量固定遍历的首地址
if (strcpy == NULL)
strcpy = p;//如果传过来的指针是空,设strcpy指针为静态指针p指向后面记录NULL'\0'的指针地址
while (*strcpy)//开始遍历内容
{
sep = fsep;//每次符号遍历完重置符号首地址
for (; *sep; sep++)//遍历符号
{
if (*strcpy == *sep)//遍历到的符号与内容sep设定的字符相同说明找到分割符了
{
p = strcpy+1; //静态指针记录找到的sep符号的地址再偏移1,下次循环从此地方开始找
*strcpy = NULL; //把符号设空指针即为'\0';
break;
}
}
if (*strcpy && flag) //循环下来的时候发现找到非sep包含的分割字符就记录下来
{
temp = strcpy;
flag = 0;
}
if (!(*strcpy) && flag == 0)//strcpy是NULL&&flag=0时说明找到了分割符和前面找到有有效内容
return temp;//返回地址
strcpy++;
}
}
int main()
{
char str[] = " ....2..@@.@12.3@com@123";
char* sep = ".@";
char cpy[1000] = { 0 };
strcpy(cpy, str); //分割会破坏源字符串,拷贝一份
char* ret = NULL;
for (ret = my_strtok(cpy, sep); ret != NULL; ret = my_strtok(NULL, sep))//循环打印测试
{
printf("%s\n", ret);
}
//下面为测试单个或者多个打印结果来调试观察代码执行和结果
//ret = my_strtok(cpy,sep);
//printf("%s\n", ret);
//ret = my_strtok(NULL, sep);
//printf("%s\n", ret);
return 0;
重点在于使用静态变量的特点每次函数返回的时候不会销毁,记录每次分割的地址

浙公网安备 33010602011771号