strtrok_s函数不带2个参数

时间:2016-04-04 01:29:01

标签: c++ visual-c++

//一个简单的程序,它将空格和逗号解释为分隔符(单独的字符)

//并打印每个子字符串 - 即每个标记 - 在其自己的行上:

.txt

}

这是它给我的问题错误1错误C2660:'strtok_s':函数不带2个参数

IntelliSense:函数调用中的参数太少

1 个答案:

答案 0 :(得分:1)

编译器仅推荐更安全的CRT功能,如果您真的想使用原始的strtok功能,它还会为您提供关闭警告的说明:

warning C4996: 'strtok': This function or variable may be unsafe. Consider
using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNING

只需添加_CRT_SECURE_NO_WARNING作为预处理器在项目设置中定义或添加到stdafx.h文件的顶部#define _CRT_SECURE_NO_WARNING 1

请参阅Security Features in the CRT

你显然对C / C ++很陌生,所以你现在还不用担心这个细节。这个警告的原因是因为许多可以追溯到Kernighan & Ritchie's original language的长标准C字符串库函数在现代恶意软件世界中存在一些固有的安全问题。因此,任何生产应用程序都应该避免使用“更安全的CRT”版本。

特别是strtok通过在库中具有内部隐藏状态来工作,有时可以利用它在解析器中创建安全问题。

char *strtok(char *str, const char *delim);

strtok_s函数只需要一个显式的上下文变量用于状态而不是隐藏的内部变量。它在所有其他方面与strtok完全相同。

char *strtok_s(char *strToken, const char *strDelimit, char **context);

因此,您的代码与您的图书示例完全相同,如下所示:

#include <iostream>
#include <cstring>
using namespace std;

int main(){

char the_string[81], *p;
char *next_token = nullptr;

cout << "Input a string to parse: ";
cin.getline(the_string, 81);
p = strtok_s(the_string, ", ", &next_token);
while (p != nullptr) {
cout << p << endl;
p = strtok_s(nullptr, ", ", &next_token);
}


return 0;
}   

有关更安全CRT的更多信息和历史记录,请参阅Security Development Lifecycle (SDL) Banned Function Calls