7

所以我有这个代码:

#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;

...

char* b = new char [10];
strcpy(b, "1234567890");

错误:microsoft visual studio 11.0\vc\include\string.h(110):参见“strcpy”的声明

我如何解决它?

4

7 回答 7

21

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

右键单击您的 C++ 并选择“属性”项以进入属性窗口。

现在跟随并展开到“配置属性”->“C/C++”->“预处理器”->“预处理器定义”。

在“预处理器定义”中添加

_CRT_SECURE_NO_WARNINGS

但最好添加

_CRT_SECURE_NO_WARNINGS;%(预处理器定义)

至于继承预定义的定义

恕我直言,在大多数情况下,这是一个好方法。

于 2012-10-24T04:24:19.970 回答
15

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

于 2012-08-30T19:42:00.663 回答
5

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

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

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

于 2012-08-30T19:59:01.870 回答
3

我不得不使用 strcpy_s 并且它起作用了。

#include "stdafx.h"
#include<iostream>
#include<string>

using namespace std;

struct student
{
    char name[30];
    int age;
};

int main()
{

    struct student s1;
    char myname[30] = "John";
    strcpy_s (s1.name, strlen(myname) + 1 ,myname );
    s1.age = 21;

    cout << " Name: " << s1.name << " age: " << s1.age << endl;
    return 0;
}
于 2016-02-07T21:41:16.790 回答
1

将此行添加到标题顶部

#pragma warning(disable : 4996)
于 2019-12-17T16:57:19.757 回答
0

如果您收到有关已弃用函数的错误消息,请尝试执行#define _CRT_SECURE_NO_WARNINGSor #define _CRT_SECURE_NO_DEPRECATE。这些应该解决它。如果需要,您还可以使用 Microsoft 的“安全”功能。

于 2017-02-09T14:20:10.580 回答
-3

对于我的问题,我删除了该 #include <glui.h>语句,它运行没有问题。

于 2015-11-02T04:25:12.197 回答