问题--在C++使用strcpy等函数时发生C4996报错

1.问题如下:

C4996:'strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use_CRT_SECURE_NO_WARNINGS. See online help for details.

根本原因:某些 C/C++ 函数(例如 strcpysprintf 等)在某些编译器中被认为是不安全的,因为它们可能会导致缓冲区溢出漏洞。
为了防止开发人员意外地使用这些函数而不加限制,编译器会发出警告。

2.解决方式

1.替换为strncpy或者strcpy_s(),但是需要填写三个参数,即还要填写复制过去的个数,防止溢出,但是我们平时比较简单的测试程序是不需要的。

2.使用#define CRT_SECURE_NO_WARNINGS
#define CRT_SECURE_NO_WARNINGS 是一个用于禁止编译器产生与安全相关警告相关的预处理宏。它通常用于解决在使用部分标准 C/C++ 函数时可能发生的编译器警告问题。

遇到的问题:

填写之后还是发生了报错?
最后参考CSDN博客:https://blog.csdn.net/HWFGLF/article/details/126983374
得知这个#define CRT_SECURE_NO_WARNINGS必须要加在开头,才能生效
个人觉得应该和编译器的处理顺序有关系?

在此贴上我的程序吧:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string.h>
using namespace std;
class Person {
    //结构体中所有成员默认都是公有的,类中所有成员默认都是私有的,也可以修改成员的访问权限
public: //公有的
    char name[64];
    int age;
    void PersonEat() {
        printf("%s在吃人吃的饭!\n", name);
    }
};

class Dog {
public:
    char name[64];
    int age;
    int type;//动物种类
    void AnimalEat() {
        printf("%s在吃动物吃的饭!\n", name);
    }
};


int main() {
    Person p1;
    p1.age = 20;
    strcpy(p1.name, "bob");
    p1.PersonEat();

    Dog d1;
    d1.age = 20;
    strcpy(d1.name, "旺财");
    d1.AnimalEat();
}
posted @ 2023-07-29 15:55  DawnTraveler  阅读(213)  评论(0编辑  收藏  举报