strtrok_s函数不接受2个参数

strtrok_s function does not take 2 arguments

本文关键字:2个 参数 不接受 函数 strtrok      更新时间:2023-10-16

//一个简单的程序,将空格和逗号解释为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)禁止的函数调用