我已经开发了自己的strtok版本。只是为了练习使用指针。
有没有人能看出这方面的局限性,或者我可以改进的地方。

void stvstrtok(const char *source, char *dest, const char token)
{
    /* Search for the token. */
    int i = 0;
    while(*source)
    {
        *dest++ = *source++;
        if(*source == token)
        {
            source++;
        }
    }
    *dest++ = '\0';
    }

int main(void)
{
    char *long_name = "dog,sat ,on ,the,rug,in ,front,of,the,fire";
    char buffer[sizeof(long_name)/sizeof(*long_name)];

    stvstrtok(long_name, buffer, ',');

    printf("buffer: %s\n", buffer);

   getchar();

   return 0;
}

最佳答案

附带说明:“token”一词通常用于描述返回的字符串部分。分隔符用于描述分隔标记的事物。因此,为了使代码更清晰,应该将token重命名为delimiter,将dest重命名为token\u dest。
功能和strtok的不同之处:
你的功能和strtok有几个不同之处。
您的函数所做的只是删除标记分隔符
只调用函数一次以处理字符串的所有部分。使用strtok,可以为字符串的每个部分多次调用它(后面的时间以null作为第一个参数)。
strtok还会破坏源字符串,而您的代码使用自己的缓冲区(我认为最好像您那样使用自己的缓冲区)。
strtok存储每次调用后第一个参数为空的下一个标记的位置。此位置随后用于后续调用。但这不是线程安全的,您的函数将是线程安全的。
strtok可以使用多个不同的分隔符,而您的代码只使用一个。
也就是说,我将为如何使一个更好的函数,而不是一个更接近strtok实现的函数提供建议。
如何改进功能(不模拟strtok):
我认为最好做以下修改:
让您的函数简单地返回“next”标记
当有*source或*source==分隔符时,中断循环
返回指向包含下一个标记的源字符串的第一个字符的指针。此指针可用于后续调用。

09-04 17:52
查看更多