【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

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




相关文章
|
5天前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
42 23
|
5天前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
28 15
|
5天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
41 24
|
1天前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
35 16
|
4天前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
24 1
|
1月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
75 10
|
1月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
60 9
|
1月前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
48 8
|
1月前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
55 6
|
1月前
|
存储 C语言
【C语言】输入/输出函数详解
在C语言中,输入/输出操作是通过标准库函数来实现的。这些函数分为两类:标准输入输出函数和文件输入输出函数。
330 6