//一个简单的程序,它将空格和逗号解释为分隔符(单独的字符)
//并打印每个子字符串 - 即每个标记 - 在其自己的行上:
.txt
}
这是它给我的问题错误1错误C2660:'strtok_s':函数不带2个参数
IntelliSense:函数调用中的参数太少
答案 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