Visual Studio 2012中的strcpy()错误

Iva*_*nov 4 c++ visual-studio-2012

所以我有这个代码:

#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
Run Code Online (Sandbox Code Playgroud)

...

char* b = new char [10];
strcpy(b, "1234567890");
Run Code Online (Sandbox Code Playgroud)

错误:microsoft visual studio 11.0\vc\include\string.h(110):查看'strcpy'的声明

我如何解决它?

Eat*_*oes 15

快速解决方法是将_CRT_SECURE_NO_WARNINGS定义添加到项目的设置中

右键单击C++并选择"属性"项以转到属性窗口.

现在按照并扩展到"配置属性" - >"C/C++" - >"预处理器" - >"预处理器定义".

在"预处理器定义"中添加

_CRT_SECURE_NO_WARNINGS

但添加是个好主意

_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)

至于继承预定义的定义

恕我直言,这是一个很好的方法.


Joh*_*0te 11

在MSDN上有一个解释和解决方案:

函数strcpy被认为是不安全的,因为没有边界检查并且可能导致缓冲区溢出.

因此,正如它在错误描述中所建议的那样,您可以使用strcpy_s而不是strcpy:

strcpy_s(char*strDestination,size_t numberOfElements,
const char*strSource);

和:

要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS.详细信息请参见在线帮助.

http://social.msdn.microsoft.com/Forums/da-DK/vcgeneral/thread/c7489eef-b391-4faa-bf77-b824e9e8f7d2

  • 我完全同意。但是,当您移植代码时,您可能不想追踪每个 strcpy 并将其设为 strcpy_s/strncpy/无论什么,所以很高兴知道这两个选项:) (2认同)

RKT*_*XYN 6

将此行添加到标题顶部

#pragma warning(disable : 4996)
Run Code Online (Sandbox Code Playgroud)


Avi*_*ger 5

您收到的消息是 MS 的建议,他们建议您不要使用标准的 strcpy 函数。他们这样做的动机是很容易以不好的方式误用(并且编译器通常无法检测并警告您这种误用)。在您的帖子中,您正是这样做的。你可以通过告诉编译器不要给你那个建议来摆脱这个消息。但是,代码中的严重错误仍然存​​在。

您正在创建一个可容纳 10 个字符的缓冲区。然后您将 11 个字符塞入其中。(还记得结尾的 '\0' 吗?)你拿了一个刚好足够容纳 10 个鸡蛋的盒子,并试图把 11 个鸡蛋塞进去。这对你有什么好处?不这样做是你的责任,编译器通常不会检测到这样的事情。

您已标记此 C++ 并包含字符串。我不知道你使用 strcpy 的动机,但如果你使用 std::string 而不是 C 风格的字符串,你会得到扩展以容纳你在其中的内容的框。