Visual Studio 2012中的strcpy()错误

时间:2012-08-30 19:31:17

标签: c++ visual-studio-2012

所以我有这段代码:

#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'的声明

我该如何解决?

7 个答案:

答案 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>语句,它运行没有问题。