C++ strtok_s未在此范围内声明

C++ strtok_s未在此范围内声明,c++,string,split,strtok,C++,String,Split,Strtok,我试图在点上分割我的实际关键点,然后在点上分割后提取所有字段 我的钥匙看起来像这样- t26.example.1136580077.colox 下面是我印象中的代码,它应该可以正常工作。但不知何故,每当我编译这段代码时,我总是得到- error: âstrtok_sâ was not declared in this scope 下面是我的代码 if(key) { vector<string> res; char* p; char* totken = s

我试图在点上分割我的实际关键点,然后在点上分割后提取所有字段

我的钥匙看起来像这样-

t26.example.1136580077.colox
下面是我印象中的代码,它应该可以正常工作。但不知何故,每当我编译这段代码时,我总是得到-

 error: âstrtok_sâ was not declared in this scope
下面是我的代码

if(key) {
    vector<string> res;
    char* p;
    char* totken = strtok_s(key, ".", &p);
    while(totken != NULL)
    {
        res.push_back(totken);
        totken = strtok_s(NULL, ".", &p);
    }

    string field1 = res[0]; // this should be t26
    string field2 = res[1]; // this should be example
    uint64_t field3 = atoi(res[2].c_str()); // this should be 1136580077
    string field4 = res[3]; // this should be colox

    cout<<field1<<" "<<field2<<" "<<field3<<" "<<field4<<endl;
}         

知道我做错了什么吗?如果还有更好的方法,那么我也愿意接受这个建议。我的印象是,使用strtok_将更加高效,并且线程安全。

strtok_
适用于windows。你这里有一个相似的线索:啊。。。我早该知道这件事的。。那么,如何使用plain
strtok
解决上述问题呢?我相信,我不能简单地用
strtok
取代
strtok\u
?我认为Joachim的解决方案适合您的需要(即使用预处理器指令使用
strtok\u
strtok\u
,具体取决于您的平台),但还应该有其他方法来使用strtok函数直接解决这个问题?为什么要用strtok_r和strtok_s使事情复杂化呢。起初我的印象是,strtok_s可以在任何地方工作,但现在看来,我主要是在寻找简单的strtok或任何其他有效方式的解决方案。
strtok_s
适用于windows。你这里有一个相似的线索:啊。。。我早该知道这件事的。。那么,如何使用plain
strtok
解决上述问题呢?我相信,我不能简单地用
strtok
取代
strtok\u
?我认为Joachim的解决方案适合您的需要(即使用预处理器指令使用
strtok\u
strtok\u
,具体取决于您的平台),但还应该有其他方法来使用strtok函数直接解决这个问题?为什么要用strtok_r和strtok_s使事情复杂化呢。起初我的印象是,strtok_在任何地方都可以工作,但现在看来我主要是在寻找简单的strtok或任何其他有效方式的解决方案。谢谢Michael的建议。如何在C++代码中使用上述代码?我应该把上面的代码放在我的C++项目的末尾吗?谢谢米迦勒的建议。如何在C++代码中使用上述代码?我应该把上面的代码放在我的C++项目的末尾吗?
#ifndef _MSC_VER
inline
char* strtok_s(char* s, const char* delm, char** context)
{
        return strtok_r(s, delim, context);
}
#endif
#ifndef _MSC_VER
inline
char* strtok_s(char* s, const char* delm, char** context)
{
        return strtok_r(s, delim, context);
}
#endif