2016-09-15 169 views
1

我正在使用Visual Studio 2015,並且正在嘗試使用strtok_r。出於某種原因,編譯器不能識別它。Strtok_r無法解析的外部符號

這裏是我的代碼:http://linux.die.net/man/3/strtok_r

的功能是棄用:

#include <string.h> 
#include <stdlib.h> 
#include <assert.h> 

char** str_split(char* a_str, const char a_delim, int * argc) 
{ 
    ... some other code 
    if (result) 
    { 
    size_t idx = 0; 
    char* saveptr = a_str; 
    char* token = strtok_r(a_str, delim, &saveptr); 
    //char * token; 
    while (token) 
    { 
     assert(idx < count); 
     *(result + idx++) = strdup(token); 
     token = strtok_r(0, delim, &saveptr); 
    } 
    assert(idx == count - 1); 
    *(result + idx) = 0; 
    } 

return result; 

我有這個文件已經下?還是我犯了一個愚蠢的錯誤?提前謝謝你們。

+3

MS不完全POSIX兼容。如果使用MS工具進行編程,則需要閱讀[MS文檔](https://msdn.microsoft.com/en-us/library/2c8d19sb.aspx),而不是Linux文檔。 – kaylum

+1

實際上,POSIX-ish系統上的strtok_r()與Windows系統上的strtok_s()相當。這種對等並不總是有效,但在這種特定情況下,它確實如此。 –

回答

7

Linux手冊頁不提供Windows平臺的文檔。你需要使用以下功能之一:

strtok_s,_strtok_s_l,wcstok_s,_wcstok_s_l,_mbstok_s,_mbstok_s_l

[0] https://msdn.microsoft.com/en-us/library/2c8d19sb.aspx

+0

當然,這個問題是_compiler_ visual-studio-2015而不是操作系統。 – chux

+1

Visual Studio只在WIndows平臺上,所以我認爲它暗示 –

+0

@chux你讓編譯器和標準庫混淆了。 strtok是標準庫的一部分,而不是編譯器。在這種情況下,更準確地說** C實現**,它將涵蓋編譯器,運行時和標準庫。 – jforberg