0

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

我试图禁用安全警告,但我发现 _CRT_SECURE_NO_WARNINGS 选项在我的 VS express 中不可用。所以我不得不修改我的代码以使用 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

第二个代码有什么问题?

4

1 回答 1

1

这是因为下一次连续调用strtok_s期望context指针(最后一个参数strtok_s)被最后一次调用填充。

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

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

于 2013-05-02T05:42:52.063 回答