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