C中的strtok和strtok_r有什么区别?

时间:2014-03-05 22:15:12

标签: c strtok

在C中strtok和strtok_r之间有什么区别?我们应该在什么时候使用哪个?

4 个答案:

答案 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)

当你将NULL作为第一个参数时,

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可能因呼叫而异。