簡體   English   中英

C 中的 strtok 和 strtok_r 有什么區別?

[英]What's the difference between strtok and strtok_r in C?

C strtokstrtok_r之間有什么區別,我們什么時候應該使用哪個?

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()函數也可用於將兩個解析循環相互嵌套。

strtok保存靜態指針以備下次使用,當您將 NULL 作為第一個參數時,因此您無法並行解析 2 個字符串。

strtok_r您還給出了指針,作為 out 參數(指向指針的指針)。 所以函數中沒有靜態指針,您可以從一個字符串移動到另一個字符串並返回......

根據文檔,strtok_r() 函數是 strtok() 的可重入版本。

char *strtok_r(char *s1, const char *s2, char **s3);

它從字符串 s1 中獲取下一個標記,其中標記是由 s2 中的字符分隔的字符串。 要從 s1 獲取第一個標記,調用 strtok_r() 時將 s1 作為其第一個參數。 來自 s1 的剩余標記是通過調用 strtok_r() 獲得的,其中第一個參數為空指針。 分隔符字符串 s2 可以因調用而異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM