关于关于error C4996: 'scanf': This function or variable may be unsafe.的解决方案
问题来源
上学期的数据结构没学好想要复习数据结构的时候,去W3Cschool去看了一下数据结构 , 顺带把C语言也复习一遍 , 正好前两天VS发布了2022 , 于是便进行了更新 ,在结构体那一章节的时候 ,代码运行出现了错误
下面是原本代码
#include <stdio.h>
#include <string.h>
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
/* 函数声明 */
void printBook( struct Books *book );
int main( )
{
struct Books Book1; /* 声明 Book1,类型为 Book */
struct Books Book2; /* 声明 Book2,类型为 Book */
/* Book1 详述 */
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
/* Book2 详述 */
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Zara Ali");
strcpy( Book2.subject, "Telecom Billing Tutorial");
Book2.book_id = 6495700;
/* 通过传 Book1 的地址来输出 Book1 信息 */
printBook( &Book1 );
/* 通过传 Book2 的地址来输出 Book2 信息 */
printBook( &Book2 );
return 0;
}
void printBook( struct Books *book )
{
printf( "Book title : %s\n", book->title);
printf( "Book author : %s\n", book->author);
printf( "Book subject : %s\n", book->subject);
printf( "Book book_id : %d\n", book->book_id);
}
在编译后出现了报错 : 于是就去谷歌查询了一下 , 微软官方的说明是编译器警告
错误原因
错误是来源于微软的警告 , 主要是因为在旧的c语言库中 , 很多函数内部是没有进行参数的检测 , 微软出于好意 , 编写了新的安全的函数 , 将函数内部增加了安全检测 ,
新的函数会更加的安全和便捷。
微软官方文档
解决方案
在查询了微软的官方文档后 ,微软提供了几种解决方案
方法一: 更改函数
其中微软说明的关闭警告的首选方式是将代码中的函数转换为微软推荐的函数 ,如将strcpy
更改为strcpy_s
,经过实际验证后 ,在上方代码中并未发现异常。
方法二: 关闭警告
这种方法是通过使用警告杂注 #pragma warning(suppress : 4996)
来忽略编译器弹出的警告窗口。想在全局中关闭警告 , 则需要使用 /wd4996
命令行进行实现。
以及使用VS预处理器宏禁用警告 :
- 打开项目的 " 属性页 " 对话框。 有关如何使用 “属性页” 对话框的信息,请参阅 属性页。
- 展开 " 配置属性" " c/c + + > 预处理器"。
- 在 " 预处理器定义 " 属性中,添加宏名称。 选择“确定” 进行保存,然后重新生成项目。
也可以在头文件中添加下面的代码进行屏蔽警告:
- 在预编译头文件stdafx.h 中定义下方宏文件
#define _CRT_SECURE_NO_DEPRECATE
- 或者声明
#pragma warning(disable:4996
方法三: 修改函数名称
将原来的旧函数替换成新的 Security CRT functions。
方法四: 替换更为安全的CRT函数
同方法一更改函数 ,但是一个个的更改过于麻烦 , 所以推荐一个更加简单的方法 :
- 在预编译头文件 stdafx.h 里(同样要在没有include任何头文件之前)定义下面的宏:
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
这样在链接的时候会将其自动转换为CRT函数