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

简介: 【C语言】一次性解决visual studio中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函数不安全,这里我给大家举一个例子来说明。

2020062310470442.png

大家可以观察到我这里定义了一个字符类型的数组 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-

2020062310470442.png

这是图片演示

缺点:每新建一个源.c文件都需要设置一次SDL检查,十分繁琐。

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

2020062310470442.png

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

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

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

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

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

(1)在安装路径下一步一步找,比如我的安装路径:

2020062310470442.png

缺点:文件的路径太细,很多人是找不到这个文件的。

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

2020062310470442.png

2020062310470442.png

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


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

2020062310470442.png

20200623104134875.png

2020062310470442.png

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

2020062310470442.png

2020062310470442.png

2020062310470442.png

3、把桌面上修改过后的文件保存下来,到 “newc++file.cpp” 文件路径下粘贴上去,然后点击“替换目标中的文件”,就大功告成了。

2020062310470442.png

:把 “newc++file.cpp” 文件复制粘贴到桌面上在修改其中内容然后在替换原文件的原因是:如果我们直接修改 “newc++file.cpp” 文件中的内容,系统会向我们索要管理员权限,而上面的方法则不会。

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

2020062310470442.png

如果大家觉得这篇文章对大家有帮助的话,还请大家点个赞 ,谢谢啦。




相关文章
|
2月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
960 0
|
4月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
312 15
|
9月前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
356 1
一文彻底搞清楚C语言的函数
|
10月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
414 3
|
10月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
327 2
Visual Studio 2022 中VLD库如何安装
Visual Studio 2022 中VLD库如何安装
865 1
Visual Studio 2022 中VLD库如何安装
Visual Studio 2022 中VLD库如何安装
879 0
|
IDE 开发工具 C语言
Visual Studio 2017 安装及使用(新手)
Visual Studio 2017 安装及使用(新手)
2059 0
|
弹性计算 自然语言处理 Windows
通义灵码 Visual Studio 下载安装指南(附安装包)
本安装步骤适用于 Windows 10 及以上操作系统中安装和使用通义灵码。
135992 21
|
前端开发 JavaScript 开发工具