strtok
和strtok_r
在C语言中有何不同,我们应该在何时使用它们?
strtok
的等效实现(通常是这样定义的):
char *strtok(char *str, const char *delim) {
static char *save;
return strtok_r(str, delim, &save);
}
通常情况下,您应该直接使用strtok_r
而不是strtok
,除非您需要使您的代码可移植到仅支持strtok
的pre-POSIX-2001系统。
_r
版本的函数是可重入的:可以同时从多个线程调用它们,或在嵌套循环中调用,等等。可重入版本通常需要一个额外的参数,这个参数用于在调用之间存储状态,而不是使用全局变量。man 3 strtok
):
strtok_r()
函数是strtok()
的可重入版本。在每次调用时必须提供上下文指针 last。只要使用单独的上下文指针,strtok_r()
函数也可以用于将两个解析循环嵌套在一起。
*.h
文件中。这些函数不是“标准C”,但它们是POSIX标准的一部分。我能想到的另一个是strerror_r
。 - Dietrich Eppstrtok
函数会保存一个静态指针以便在下一次调用时重复使用,当你将第一个参数设置为 NULL 时,无法同时解析两个字符串。
strtok_r
函数需要传递一个作为输出参数的指针(指向指针的指针),因此该函数没有静态指针。这意味着你可以在多个字符串之间自由移动。
char *strtok_r(char *s1, const char *s2, char **s3);
它从字符串s1中获取下一个标记,其中标记是由s2中的字符分隔的字符串。要从s1中获取第一个标记,需要使用strtok_r(),并将s1作为其第一个参数调用。通过使用空指针作为第一个参数调用strtok_r(),可以获得来自s1的剩余标记。分隔符字符串s2在每次调用时都可能不同。
strtok_s
。 - Per Johansson