不安全原因:

scanf函数并不会检查是否会越界访问。可能会导致数组溢出或缓冲区溢出,让黑客有可乘之机,从而发出“缓冲区溢出”攻击,如下程序:a最多只能存储四个字符(末尾存储“\0"),不足以容纳用户输入的全部数据,所以多出来的4个字符就会使用a后面的内存,而a后面的内存可能没有使用权限,或者已经被别的内存占用,这种错误只能等到程序运行时才能检测出来,在编译期间根本无法检测:一旦检测出就是”程序崩溃”。因此scanf_s这样的函数可以防止hacker利用原版的不安全性(漏洞)黑掉系统。

1 #define _CRT_SECURE_NO_WARNINGS

2 #pragma warning(disable:6031)

3

4 #include

5

6 int main(void)

7 {

8 char s[5];

9 printf("请输入字符串(长度小于5):");

10 scanf_s("%s", s, 5);

11 printf("符串输出字符串:%s\n\n", s);

12

13 printf("请输入字符串(长度大于等于5):");

14 scanf_s("%s", s, 5);

15 printf("符串输出字符串:%s\n\n", s);

16

17 printf("请输入字符串(长度小于等于5):");

18 scanf("%s", s);

19 printf("符串输出字符串:%s\n\n", s);

20

21 printf("请输入字符串(长度大于等于5):");

22 scanf("%s", s);

23 printf("符串输出字符串:%s\n\n", s);

24

25 return 0;

26 }

解决方法:

方法一

使用sccanf_s来代替scanf函数。scanf_s是VS编译器提供的一种你函数,它能有效解决scanf函数不安全的问题。

缺点:

(1)scanf_f函数的一些具体使用细节与scanf函数并不相同,我们需要单独学习scanf_s的使用方法。

(2)scanf_s不通用。scanf_s是VS编译器提供的,所以在其他平台上并不通用,这就导致了scaf_s编写出来的代码并不通用。

(3)除了scsnf函数,象gets,strcpy,strcat等函数在VS编译器中也会产生相同的问题。

方法二

在程序前面加上#define_CRT_SECURE_NO_WARNINGS 1

1 #define _CRT_SECURE_NO_WARNINGS 1

缺点:每次新建一个源.c文件都要在头部加上这个预处理命令,麻烦。

方法三

取消SDL检查。步骤:项目 -> 属性 -> C/C++ -> SDL检查 -> 否/SDL-

缺点:每次新建一个源.c文件都要重复这个步骤,麻烦。

方法四

一劳永逸,点击下面链接

【C语言】一次性解决visual studio中scanf函数不安全报错问题_c语言scanf不安全_野猪佩奇`的博客-CSDN博客