尝试实现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;

重点在于使用静态变量的特点每次函数返回的时候不会销毁,记录每次分割的地址

posted @ 2022-08-24 04:27  godex  阅读(52)  评论(0)    收藏  举报