一.错误信息
错误 | 详细信息 |
---|---|
C4996 | ‘scanf’:This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. |
vs2019使用更安全的c14/c17标准, 认为这类函数不安全。
这类函数正常使用时,是没有任何问题的。但是,部分黑客可能会利用其中的缺陷,开发恶意软件,对系统造成影响(缓冲区溢出,程序崩溃)。
二.代码
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main(void)
{
int num;
scanf("%d", &num);
return 0;
}
三.解决方案
方法1:使用修改项目的属性,直接使用这些“不安全”的函数。
在项目名称上右键,选择项目属性
添加: /D _CRT_SECURE_NO_WARNINGS
方法2:使用c14标准中的“更安全”的函数
scanf_s
(数组在c中的scanf不需要取地址&,因为本身就代表了地址)
四.gets_s与scanf_s使用方法
-
gets不能使用,使用gets_s
(gets是老标准C语言函数,vs使用更安全的c11标准, 使用对应的gets_s
char line[32];
gets_s(line, sizeof(line));
//或者写为gets_s(line,32); -
scanf不能使用
原因同上,改用scanf_s
若用scanf输入字符串,没有第三个参数故不知多长,若长度越界,则占用其他内存非常可怕
int x;
scanf_s("%d", &x); //不需要使用第3个参数,用法和scanf相同
float f;
scanf_s("%f", &f); //不需要使用第3个参数, 用法和scanf相同
char c;
scanf_s("%c", &c, sizeof(c)); //需要使用第3个参数, 否则有告警
char name[16];
scanf_s("%s", name, sizeof(name)); //需要使用第3个参数
int age;
char name[16];
scanf_s("%d%s", &age, name, sizeof(name));