什么是strtok和strtok_s之间的区别?

时间:2015-12-28 18:13:59

标签: c++ c++11

在其他语言中最接近“拆分”的是什么?

他们为什么要改变它?当我尝试使用它时(没有特别的),它说它“不安全”。

感谢。

1 个答案:

答案 0 :(得分:0)

_s(_secure)函数:
在20世纪90年代早期,缓冲区溢出存在很多问题。如果我没记错的话,其中一个原因就是增加一些尺寸/长度检查。

对于分裂,我相信你正在寻找能够返回某种数组的东西。如果是这种情况,我不相信你会发现它 以下是我解析应用程序路径的方法:

我这样定义:

template<typename TDataType>
std::vector<TDataType>
Tokenize(const TDataType &oSource, const TDataType &Delimiters)
{
    std::vector<TDataType> OutputVector;

    typename TDataType::size_type xPosLast = 0;
//  auto xPosCurr = oSource.find_first_of(Delimiters, xPosLast);
    typename TDataType::size_type xPosCurr = oSource.find_first_of(Delimiters, xPosLast);

    while(xPosCurr != TDataType::npos)
    {
        if(xPosCurr != xPosLast) { // Ignore empty.
            OutputVector.emplace_back(oSource, xPosLast, xPosCurr - xPosLast);
        }
        xPosLast = xPosCurr + 1;
        xPosCurr = oSource.find_first_of(Delimiters, xPosLast);
    }
    if(xPosLast < oSource.length()) { // Ignore Last.
        OutputVector.emplace_back(oSource, xPosLast, oSource.length() - xPosLast); // add what's left of the string
    }
    return OutputVector;
}

我这样用:

std::vector<std::string> PathVec = oAH.Tokenize<std::string>(sArgs, "/");

我这样检查:

for(std::vector<std::string>::iterator it = PathVec.begin(); it != PathVec.end(); ++it) {
    std::cout << *it << ", ";
}
std::cout << std::endl << std::endl;

在OSX上,检查结果为:

Main()::Tokenize
Users, Thoth, Library, Developer, XCode, DerivedData, [AppNameAndID], Build, Products, Debug, [AppName].app, MacOS, [AppName]

经过一些关于分裂路径和标记化的研究后,我最终得到了上述内容。在定义Tokenize的标题的注释部分中,我有:
参考文献起作用:
     - Evan Teran https://stackoverflow.com/users/13430
     - 马吕斯https://stackoverflow.com/users/174650
     - 亚历克·托马斯https://stackoverflow.com/users/7980
     - Shadow2531 https://stackoverflow.com/users/1697
     - Marco M. https://stackoverflow.com/users/140311
     - Pixelchemist https://stackoverflow.com/users/951423/pixelchemist
     - Alveko https://stackoverflow.com/users/565368/alveko