在C中strtok和strtok_r之间有什么区别?我们应该在什么时候使用哪个?
答案 0 :(得分:17)
strtok
等同于(通常定义为):
char *strtok(char *str, const char *delim) {
static char *save;
return strtok_r(str, delim, &save);
}
一般情况下,您应该直接使用strtok_r
而不是strtok
,除非您需要将代码移植到仅支持strtok
的POSIX-2001之前的系统
答案 1 :(得分:12)
_r
版本的函数是可重入的:您可以同时从多个线程或嵌套循环中调用它们,等等。可重入版本通常需要额外的参数,该参数用于在调用之间存储状态而不是使用全局变量。
非重入版本通常使用全局状态,因此如果从多个线程调用它们,则可能正在调用未定义的行为。你的程序可能崩溃,或者更糟。
从手册页(man 3 strtok
):
strtok_r()
函数是strtok()
的可重入版本。上下文 必须在每次调用时提供指针last。strtok_r()
函数可以 也可以用来将两个解析循环嵌套在另一个中 使用单独的上下文指针。
答案 2 :(得分:5)
strtok
保存静态指针以供下次重用,所以你不能并行解析2个字符串。
在strtok_r
中你也给出了指针,作为out参数(指向指针的指针)。所以函数中没有静态指针,你可以从一个字符串移动到另一个字符串并返回...
答案 3 :(得分:0)
根据文档,strtok_r()函数是strtok()的可重入版本。
char *strtok_r(char *s1, const char *s2, char **s3);
它从字符串s1获取下一个标记,其中标记是由s2中的字符分隔的字符串。要从s1获取第一个标记,将使用s1作为其第一个参数调用strtok_r()。来自s1的剩余标记是通过使用第一个参数的空指针调用strtok_r()获得的。分隔符字符串s2可能因呼叫而异。