strtok_s安全调试警告解决

时间:2013-05-02 05:36:53

标签: c++ visual-studio visual-c++

我有一段代码正确地由Dev C ++编译。当我尝试使用VS2012 express执行它时,我遇到了这个警告''警告C4996:'':这个函数或变量可能不安全。考虑使用strtok_s代替。要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅在线帮助''

我尝试禁用安全警告,但我发现我的VS express中没有_CRT_SECURE_NO_WARNINGS选项。所以我不得不修改我的代码使用strtok_s而不是strtok来避免这个警告。但是,即使代码执行到最后也没有任何错误,出现错误的结果是没有出现。显然没有读取文件。这是以前在Dev C ++上运行良好的代码

const char* token[MAX_TOKENS_PER_LINE] = {}; // initialize to 0
    // parse the line
    token[0] = strtok(buf, DELIMITER); // first token
    if (token[0]) // zero if line is blank
    {
      for (n = 1; n < MAX_TOKENS_PER_LINE; n++)
      {
    token[n] = strtok(0, DELIMITER); // subsequent tokens
        if (!token[n]) break; // no more tokens

这就是我尝试使用VS2012 express执行的内容

const char* token[MAX_TOKENS_PER_LINE] = {}; // initialize to 0
    char* next_token[MAX_TOKENS_PER_LINE] = {}; // initialize to 0
    //char* next_token;
    // parse the line
    token[0] = strtok_s(buf, DELIMITER, &next_token[0]); // first token
    if (token[0]) // zero if line is blank
    {
      for (n = 1; n < MAX_TOKENS_PER_LINE; n++)
      {
    token[n] = strtok_s(0, DELIMITER, &next_token[n]); // subsequent tokens
        if (!token[n]) break; // no more tokens

第二个代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

这是因为下一次对strtok_s的连续调用需要context指针(strtok_s的最后一个参数)在最后一次调用时填写。

每次调用都使用不同的(未初始化的)指针,这意味着上下文丢失,或者说它使用看似随机的指针作为上下文。

您应该使用outcommented变量next_token而不是数组。