gpt4 book ai didi

c++ - 如何用 strcpy_s 替换 strcpy?

转载 作者:行者123 更新时间:2023-12-02 09:51:11 28 4
gpt4 key购买 nike

运行代码后,出现如下错误。如何用 strcpy_s 替换 strcpy?谢谢你的帮助。而且当我尝试直接用 strcpy_s 替换 strcpy 时,它说命名空间“std”没有成员“strcpy_s”。

严重性代码描述项目文件行抑制状态错误 C4996“strcpy”:此函数或变量可能不安全。考虑改用 strcpy_s。要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS。详细信息请参见在线帮助。 Nuitrack_project e:\nuitracksdk\nuitrack\include\nuitrack\types\issue.h 71

严重性代码描述项目文件行抑制状态错误 C4996“strcpy”:此函数或变量可能不安全。考虑改用 strcpy_s。要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS。详细信息请参见在线帮助。 Nuitrack_project e:\nuitracksdk\nuitrack\include\nuitrack\types\issue.h 81

#ifndef NUITRACK_ISSUE_H_
#define NUITRACK_ISSUE_H_

#include <memory>
#include <string>
#include<cstring>

namespace tdv
{
namespace nuitrack
{
/**
* @ingroup CommonElements_group
* @brief Describes an issue identifier.
*/
enum IssueId
{
NONE_ISSUE = 0,
FRAME_BORDER_ISSUE = 1,
OCCLUSION_ISSUE = 2,
SENSOR_ISSUE = 3
};

/**
* @ingroup CommonElements_group
* @brief Stores general information about a issue.
*
* Parent class of all issue classes.
*/
class Issue
{
public:
/**
* @brief Smart pointer to access the Issue instance.
*/
typedef std::shared_ptr<Issue> Ptr;

/**
* @brief Returns the issue type as a string.
*/
static std::string getType()
{
static std::string _type = "Issue";
return _type;
}

/**
* @brief Returns the issue name.
*/
virtual std::string getName() const
{
return std::string(_name);
}

/**
* @brief Returns the issue identifier.
*/
IssueId getId()
{
return _id;
}

/**
* @brief Constructs a default issue.
*/
Issue() :
_id(NONE_ISSUE)
{
std::string name = "Issue";
_name = new char[name.length() + 1];
std::strcpy(_name, name.c_str());
}

/**
* @brief Constructs an issue object from its identifier and name.
*/
Issue(IssueId id, const std::string &name) :
_id(id)
{
_name = new char[name.length() + 1];
std::strcpy(_name, name.c_str());
}

virtual ~Issue()
{
deleteString();
}

/**
* Release the memory occupied by the string representation of the name.
*/
void deleteString()
{
if(_name)
{
delete[] _name;
_name = NULL;
}
}

/**
* @brief Copy constructor.
*/
Issue(const Issue& issue)
{
copyIssue(issue);
}

/**
* @brief Overloaded copy assignment operator.
*/
void operator=(const Issue& issue)
{
copyIssue(issue);
}

protected:
/** @warning For internal use only. */
IssueId _id;
/** @warning For internal use only. */
char* _name;

private:
void copyIssue(const Issue& issue)
{
_id = issue._id;

uint32_t nameSize = 0;
while(issue._name[nameSize] != '\0')
nameSize++;

_name = new char[nameSize + 1];
for(uint32_t i = 0; i <= nameSize; i++)
_name[i] = issue._name[i];
}
};

} /* namespace nuitrack */
} /* namespace tdv */

#endif /* NUITRACK_ISSUE_H_ */

最佳答案

strcpy_s(“s”代表“安全”)允许您指定目标缓冲区的大小。 std::strcpy 不会这样做,因此如果您的源代码太长,您可以写入目标缓冲区的末尾,这会产生不良影响。

在上面的第一个案例中,试试这个:

_name = new char[name.length() + 1];
strcpy_s(_name, name.length() + 1, name.c_str());

简单地用 strcpy_s 替换 strcpy 不起作用有两个原因:1) strcpy_s 接受另一个参数(目标缓冲区的长度)2) strcpy_s 不是 std 的一部分,即 std 命名空间不包含 strcpy_s 的声明

所以尝试添加额外的参数,并将“std:strcpy”替换为“strcpy_s”

如果您使用的是像 Visual Stdio 这样的 IDE,您通常可以右键单击“strcpy_s”之类的术语,从出现的上下文菜单中选择“Go to Declaration”之类的内容,并快速获取有关该术语的一些信息.

  • 鲍勃

注意:如果您不熟悉编译和构建 C/C++ 程序的机制,也许值得解释错误消息。该消息告诉您,如果您想使用传统的“不安全”c 调用(如 strcpy),您可以通过将 _CRT_SECURE_NO_WARNINGS 添加到构建系统中的预处理器定义中来实现。这可以是包含相关 header 之前的 #define,也可以是 IDE 中某处的条目。如果您输入该定义,您的编译器将让您毫无怨言地使用 std::strcpy。

关于c++ - 如何用 strcpy_s 替换 strcpy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54057292/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com