2014-09-02 13 views
0

在此示例程序中,我使用strtok_r將字符串拆分爲兩個標記。指望strtok_r的內部指針安全嗎?

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char buf[] = "Hello World!"; 
    char tok[] = " "; 
    char *p; 

    char *retStr = strtok_r(buf, tok, &p); 
    printf("\"%s\" \"%s\"\n", retStr, p); 
    return 0; 
} 

該程序的輸出是

"Hello" "World!" 

按照man page指針p在內部被strtok_r再入目的。假設它指向字符串的其餘部分也是安全的,因爲我在這裏?

+0

它沒有明確指定,所以我不會依賴它。它可以被一個實現用來指向一些特殊的內部結構(儘管這是不太可能的;它很難清理它)。 – Dave 2014-09-02 19:47:16

+0

一個更現實的含糊不清是指向最新的令牌,還是最近的令牌之後的一個空間,或者它的變化。 – Dave 2014-09-02 19:48:41

回答

1

不,它不安全。該文件說只有strtok_r使用指針用於內部目的,它不應該由您在strtok_r調用之間更改。這意味着,雖然你現在已經注意到它指向了字符串的其餘部分,但它有點意外,並且庫的實現者可以改變它 - 然後由於外部庫的更改而停止工作。我會避免這種不必要的依賴。

1

除非它特別是你可以指望它是某種東西,而不是你不能。

關於如何使用某些東西的文檔模糊不清,允許開發人員改變在版本之間使用它的方式,而不會造成重大改變。所以,儘管你現在正在做的事情可能會奏效,但是沒有人會保證它會與下一個版本的圖書館一起工作。