2016-09-15 48 views
1

私はVisual Studio 2015を使用していますが、strtok_rを使用しようとしています。何らかの理由でコンパイラが認識できません。ここで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; 

私はこの文書を、次のされています:http://linux.die.net/man/3/strtok_r

は非推奨機能ですか?または私は愚かな間違いをしていますか?先輩にありがとう。

+3

MSが完全にPOSIXに準拠していません。 MSツールを使用してプログラミングする場合は、Linuxのマニュアルではなく、[MS documentation](https://msdn.microsoft.com/en-us/library/2c8d19sb.aspx)を読む必要があります。 – 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

問題は、OSではなく、_compiler_ visual-studio-2015です。 – chux

+1

Visual StudioはWIndowsプラットフォームにしかないので、暗黙のうちに –

+0

@chuxと思った。あなたはコンパイラと標準ライブラリを混乱させている。 strtokはコンパイラではなく標準ライブラリの一部です。この場合、コンパイラ、ランタイム、および標準ライブラリの両方をカバーする** C実装**が正しいと言えます。 – jforberg

関連する問題