> 文档中心 > 【C语言】一次性解决visual studio中scanf函数不安全报错问题

【C语言】一次性解决visual studio中scanf函数不安全报错问题

文章目录

  • 一、为什么选择VS2013/2019/2022编译器
  • 二、VS编译器中scanf函数不安全问题的原因
  • 三、解决scanf不安全问题的几种方法及其缺点
  • 四、一劳永逸 -- 一次性永久解决scanf不安全问题

很多同学在初次使用visual studio 这个编译软件时都会遇到scanf函数不安全报错的问题,并且不知道怎么解决,CSDN上虽然有许多关于如何解决此问题的文章,但是其中大多数的方法都需要每次重复操作,并且对这个问题没有一个系统的阐述,本人前期在使用visual studio 的时候也曾被这个问题困扰许久。``

所以,今天我专门写了这篇博客来对VS编译器中scanf及其它函数不安全问题进行一个系统的阐述,其中包括选择VS编译器的原因、scanf函数不安全的原因、系列解决不安全问题的方法以及本篇的重点:如何一次性永久解决不安全问题。

时间有限的同学可以直接点击目录阅读“一劳永逸 – 一次性永久解决scanf不安全问题”,但是我还是希望大家能够尽量把这篇文章阅读完,这有助于你对VS编译器及函数不安全报错形成一个深层次、系统性的认识。

一、为什么选择VS2013/2019/2022编译器

现在市面上流行的C语言编译器并不少,但是我比较推荐大家使用visual studio 这款编译器,具体有以下几方面的原因:

1、其他编译器的缺点:
(1)CodeBlocks 与 VSCode:不主流,且需要配置环境,许多初学者在配置环境时就放弃了,对新手不友好。
(2)Dev C++:此软件在10多年前就已经停止更新了,用此编译器打出来的代码不美观,不利于我们形成良好的代码风格。
(3)VC6.0:此编译器是98年的编译器,过于老旧,兼容性差。

2、visual studio 的优点:
(1)VS2019是集成开发环境,对新手友好,不要配置环境,可以直接使用。
(2)VS2019是主流的集成开发环境,企业中使用率比较高。
(3)VS2019的缺点就是:大,占用空间大,不过这个不是很大的问题。

3、所以综合考虑,VS编译器是我们学习C语言及其他语言的较好选择。

二、VS编译器中scanf函数不安全问题的原因

关于为什么VS编译器中会显示scanf函数不安全,这里我给大家举一个例子来说明。

在这里插入图片描述
大家可以观察到我这里定义了一个字符类型的数组 arr[5],这时系统在栈区中会给数组分配五个字节的地址。
当我们往其中输入 “Hello,word!” 这个明显大于五个字节的字符串时,由于scanf 函数并不会检查数组输入的值是否会越界访问,所以当我们在Dev C++/CodeBlocks 这样的编译软件运行上述代码时,程序会正常结束。这样就会导致数组越界访问,而数组越界访问有时候造成的后果是非常严重的,它可能会导致我们的系统崩溃!
但是当我们在VS上运行上述代码时,编辑器会有 Debug Error 的提示,这样可以很好的提示程序员或用户,从而避免输入非法字符串,保证程序安全。

三、解决scanf不安全问题的几种方法及其缺点

现在网上常见的几种解决 scanf 函数不安全问题的方法分别有几种:

1、使用 scanf_s 函数来代替 scanf 函数。 scanf_s 函数是VS编译器提供的一种函数,它能有效解决 scanf 函数不安全的问题,但是它有几个缺点

(1)scanf_s 函数的一些具体使用细节与 scanf 函数并不相同,我们需要单独学习 scanf_s 的使用方法。
(2)scanf_s 不通用。由于 scanf_s 是VS编译器所提供的,所以在其他平台上并不通用,这就导致用 scanf_s 编写出来的代码不通用。
(3)除了 scanf 函数,像 gets、strcpy、strcat 等函数在VS编译器中也会产生相同的问题。

(2)在程序前面加上 #define _CRT_SECURE_NO_WARNINGS 1

#define _CRT_SECURE_NO_WARNINGS 1

缺点:每次新建一个源.c文件都需要在在头部加上这个预处理命名,十分繁琐。

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

在这里插入图片描述这是图片演示
缺点:每新建一个源.c文件都需要设置一次SDL检查,十分繁琐。

(4)添加预处理定义。步骤:项目 -> 属性 -> C/C++ -> 预处理器 -> 预处理定义 -> 编辑 -> 加 “_CRT_SECURE_NO_WARNINGS 1”。

在这里插入图片描述
缺点:每新建一个源.c文件都需要添加一次预处理命名,十分繁琐。

(5)一劳永逸 – 一次性永久解决scanf不安全问题。特点:第一次操作需要花费一点时间,但是可以一劳永逸。

四、一劳永逸 – 一次性永久解决scanf不安全问题

1、在电脑中找到 “newc++file.cpp” 文件。

在VS的安装路径下会有一个叫做 “newc++file.cpp” 的文件,我们找到这个文件,其中找到这个文件的方法有三种(推荐使用第三种方法):

(1)在安装路径下一步一步找,比如我的安装路径:
在这里插入图片描述缺点:文件的路径太细,很多人是找不到这个文件的。

(2)找到文件的大致位置,比如visual studio 的安装路径,然后在该路径下搜索 “newc++file.cpp” 。

在这里插入图片描述
在这里插入图片描述注意:搜索文件时的路径尽量细分一点,就比如当我只在C盘这个大目录下面搜索 “newc++file.cpp” 文件时,搜索很久都没有结果。

(3)**(推荐)**如果有同学还是觉得找路径太难的话,那么我给大家推荐一个软件, “everything”,这个软件可以帮助大家迅速找到你电脑中的任何文件,在许多时候都十分有用。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、把此文件复制粘贴到桌面上,然后打开它,在里面加上 “#define _CRT_SECURE_NO_WARNINGS 1” ,然后保存退出。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、把桌面上修改过后的文件保存下来,到 “newc++file.cpp” 文件路径下粘贴上去,然后点击“替换目标中的文件”,就大功告成了。
在这里插入图片描述
:把 “newc++file.cpp” 文件复制粘贴到桌面上在修改其中内容然后在替换原文件的原因是:如果我们直接修改 “newc++file.cpp” 文件中的内容,系统会向我们索要管理员权限,而上面的方法则不会。

4、做完上面一系列的操作后,现在我们只要打开或者新建任意一个源.c/cpp文件时,其头部将会自动加上 “#define _CRT_SECURE_NO_WARNINGS 1”,而不需要我们每次都手动加上或者修改设置了,一劳永逸!

在这里插入图片描述
如果大家觉得这篇文章对大家有帮助的话,还请大家点个赞 ,谢谢啦。

闲鱼礼物网