strtrok_s函数不接受2个参数
strtrok_s function does not take 2 arguments
//一个简单的程序,将空格和逗号解释为delimeter(分隔字符)
//并打印每个子字符串,也就是说,每个令牌在其自己的行上:
#include "stdafx"
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char the_string[81], *p;
cout << "Input a string to parse: ";
cin.getline(the_string, 81);
p = strtok_s(the_string, ", ");
while (p != nullptr) {
cout << p << endl;
p = strtok_s(nullptr, ", ");
}
return 0;
}
这就是它给我带来的问题错误1错误C2660:"strtok_s":函数不接受2个参数
IntelliSense:函数调用中的参数太少
编译器只是推荐更安全的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
请参阅CRT 中的安全功能
很明显,您对C/C++还很陌生,所以现在还不需要担心这个细节。之所以出现这个警告,是因为许多可以追溯到Kernighan&里奇的原始语言在现代恶意软件世界中存在一些固有的安全问题。因此,任何生产应用程序都应该避免他们青睐"更安全的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的更多信息和历史记录,请参阅安全开发生命周期(SDL)禁止的函数调用
相关文章:
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 为什么 c++11 std::lock 和 std::scoped_lock 至少需要 2 个参数?
- 具有多个参数的模板化类专用化,其中一个模板参数是模板本身
- 在 masm x64 上打印具有多个参数
- C++ 具有 2 个模板参数的类,具有 1 个参数的函数
- 可变参数模板作为第一个参数
- 在C++中使用 std::forward 的多个参数
- 如果条件,当我想第二个参数时
- 如何在 c++ 中存储具有值的四个参数的元组
- 将多个参数传递给运算符 []
- C++ 具有GTest TYPED_TEST的多个参数
- 如何从第一个参数推断第二个参数类型?
- C++ std::enable_if - 第二个参数的功能
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 推导多个参数包
- 候选构造函数(隐式复制构造函数)不可行:第一个参数需要 l 值
- 为什么模板参数推导不适用于仅指定前两个参数的可变参数模板类?
- C++如何在 switch 语句中放置两个参数
- 生成包含给定类型的 N 个参数的可变参数列表的最佳方法?