我已经开发了自己的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==分隔符时,中断循环
返回指向包含下一个标记的源字符串的第一个字符的指针。此指针可用于后续调用。