我开发了自己的 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 == 分隔符时跳出循环
- 返回指向包含下一个标记的源字符串的第一个字符的指针。该指针可用于后续调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)