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

dre*_*999 12 c strtok

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

Chr*_*odd 18

strtok 相当于(通常定义为):

char *strtok(char *str, const char *delim) {
    static char *save;
    return strtok_r(str, delim, &save);
}
Run Code Online (Sandbox Code Playgroud)

通常,您应该strtok_r直接使用而不是strtok,除非您需要将代码移植到仅支持的POSIX-2001之前的系统strtok


Die*_*Epp 12

_r函数的版本是可重入的:您可以同时从多个线程或嵌套循环中调用它们,等等.可重入版本通常需要额外的参数,此参数用于在调用之间存储状态而不是使用全局变量.

非重入版本通常使用全局状态,因此如果从多个线程调用它们,则可能正在调用未定义的行为.你的程序可能崩溃,或者更糟.

从手册页(man 3 strtok):

strtok_r()函数是一个可重入的版本strtok().必须在每次调用时提供最后一个上下文指针.strtok_r()只要使用单独的上下文指针,该函数也可用于将两个解析循环嵌套在另一个中.


SHR*_*SHR 5

strtok 当您将NULL作为第一个参数时,保存静态指针以供下次重用,因此您无法并行解析2个字符串.

strtok_r你给出指针,作为out参数(指针指针).所以函数中没有静态指针,你可以从一个字符串移动到另一个字符串然后返回...