所以我有这段代码:
#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'的声明
我该如何解决?
答案 0 :(得分:13)
快速解决方法是将_CRT_SECURE_NO_WARNINGS定义添加到项目的设置中
右键单击您的C ++并选择“属性”项以转到属性窗口。
现在关注并扩展为“配置属性” - &gt;“C / C ++” - &gt;“预处理器” - &gt;“预处理器定义”。
在“预处理器定义”中添加
_CRT_SECURE_NO_WARNINGS
但添加
是个好主意_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
继承预定义的定义
恕我直言在大多数情况下,这是一个很好的方法。
答案 1 :(得分:10)
在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
答案 2 :(得分:3)
您收到的消息是来自MS的建议,他们建议您不要使用标准的strcpy函数。他们在这方面的动机是很容易以不好的方式滥用(编译器通常无法检测并警告你这种滥用)。在你的帖子中,你正是这样做的。你可以通过告诉编译器不给你那个建议来消除这个消息。但是,代码中的严重错误仍然存在。
您正在创建一个缓冲区,其中包含10个字符的空间。然后你将11个字符填入其中。 (记住终止'\ 0'?)你已经拿了一个盒子,里面有足够的空间容纳10个鸡蛋,并试图将11个鸡蛋塞进去。这对你有什么影响?不这样做是你的责任,编译器通常不会检测到这些事情。
您已标记此C ++并包含字符串。我不知道你使用strcpy的动机,但是如果你使用std :: string而不是C风格的字符串,你会得到一些扩展的框,以适应你填充它们的内容。
答案 3 :(得分:2)
我必须使用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;
}
答案 4 :(得分:1)
如果您收到有关已弃用功能的错误消息,请尝试执行#define _CRT_SECURE_NO_WARNINGS
或#define _CRT_SECURE_NO_DEPRECATE
。这些应该解决它。如果需要,您还可以使用Microsoft的“安全”功能。
答案 5 :(得分:0)
将此行添加到标题的顶部
#pragma warning(disable : 4996)
答案 6 :(得分:-1)
对于我的问题,我删除了#include <glui.h>
语句,它运行没有问题。