我开发了自己的 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 重命名为 delimiter,并将 dest 重命名为 token_dest。

您的函数和 strtok 的差异:

您的函数和 strtok 之间存在一些差异。

  • 您的函数所做的只是删除令牌分隔符
  • 您只需调用一次函数即可处理字符串的所有部分。使用 strtok,您可以对字符串的每个部分多次调用它(后续多次使用 NULL 作为第一个参数)。
  • strtok 还会破坏源字符串,而您的代码使用自己的缓冲区(我认为最好像您一样使用您自己的缓冲区)。
  • strtok 在每次调用后存储下一个标记的位置,其中第一个参数为 NULL。该位置随后用于后续调用。但这不是线程安全的,并且您的函数将是线程安全的。
  • strtok 可以使用多个不同的分隔符,而您的代码仅使用一个。

话虽这么说,我将给出如何制作更好的函数的建议,而不是更接近 strtok 实现的函数。

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

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

  • 让您的函数仅返回“下一个”标记
  • 当您有 *source 或 *source == 分隔符时跳出循环
  • 返回指向包含下一个标记的源字符串的第一个字符的指针。该指针可用于后续调用。

其他提示

此代码不起作用在所有像strtok()。什么是你想要做的,是什么呢?但据改进,你的代码中有一个严重的错误:如果sourcetoken的出现次数减去长度大于dest的长度,你也得为自己更大的一个非常经典的堆栈溢出的,这似乎在此刻有点讽刺我。这不会在你使用的main发生,但使用功能的其他地方势必会带领你进入不确定性的路径和绝望的泥沼。

的strtok允许通过所有的令牌迭代。它通过假定源字符串是可写的,并在令牌断裂插入空值到它这样做。目标缓冲区是一个指针,指向字符withing源缓冲区的偏移量。你可以利用这一点来知道,当你走到了尽头+还留着电话之间的“状态”。

strtok的是不使用良好的功能,因为它破坏了源串。它也没有重入的。

的strtok()将节省一些状态,这样你就可以多次调用它来获得多个令牌。此外,的strtok()将“分裂”源串这样就可以获得多个目标串,每一个是令牌。

您所有的代码做,从我所看到的,是忽视了为令牌分隔符的任何输入字符,并继续复制到源的空终止。

编辑:此外,考虑有两个测序令牌分隔符:第一将由您的功能被忽略,第二个被写入的目标,而的strtok()将限定的2个或更多定界符seqeunce作为一个单一的定界符(手册页: http://man.cx/?page=strtok

的strtok破坏与NUL字符,这使得它种敌对的输入字符串。

您还需要考虑的“XYZ ,, PDQ”将有多少令牌将函数strtok拔出该字符串,如果“的情况下,”是分隔符。

你要什么你的函数在这种情况下怎么办?

此外,的strtok(...)支持多个分隔符。考虑strspn(...)和strcspn的定义(...),因为它们可以被用于重新执行的strtok(...)。

顺便提及,LONG_NAME是字符指针和sizeof(LONG_NAME)被的sizeof(字符*)。 不的LONG_NAME点什么尺寸。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top