Strtok_s安全调试警告解决

strtok_s security debugging warnings solving

本文关键字:警告 解决 调试 安全 Strtok      更新时间:2023-10-16

我有一段代码,已被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

第二个代码有什么问题?

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

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

您应该使用取消注释的变量next_token而不是数组。