开发了一种替代方案

ant*_*009 4 c pointers strtok

我开发了自己的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;
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ndy 7

旁注:"令牌"一词通常用于描述返回的字符串部分.分隔符用于描述分隔标记的事物.因此,为了使您的代码更清晰,您应该将token重命名为delimiter并将dest重命名为token_dest.

你的功能和strtok的差异:

你的函数和strtok之间有几点不同.

  • 您的函数所做的只是删除令牌分隔符
  • 您只需调用一次函数来处理字符串的所有部分.使用strtok,您可以为字符串的每个部分多次调用它(后续时间以NULL作为第一个参数).
  • strtok也会破坏源字符串,而你的代码使用自己的缓冲区(我认为最好像你一样使用你自己的缓冲区).
  • strtok存储每次调用后第一个参数为NULL的下一个标记的位置.然后将该位置用于后续调用.这不是线程安全的,你的功能是线程安全的.
  • strtok可以使用多个不同的分隔符,而您的代码只使用一个分隔符.

话虽这么说,我会提出如何做出更好的功能的建议,而不是更接近strtok实现的功能.

如何改进你的功能(不模仿strtok):

我认为最好进行以下更改:

  • 让你的函数只返回'next'标记
  • 当你有*source或*source == delimiter时,打破你的循环
  • 返回指向包含下一个标记的源字符串的第一个字符的指针.该指针可用于后续调用.