目录
0.前言
作为一个学习C语言的小白,难免遇到一些问题。有些问题可能在大佬面前很简单,但小白愣是照了百度做了一下午没弄出来,最后经过内心斗争,战战兢兢的在交流群里问出了自己的疑问,结果无非是没人回或者问度娘。同是小白,希望能将自己遇到的问题给别的小白帮助。
1.C语言:不安全函数
VS编译器有时候会对C标准的一些函数报错,比如scanf、strcpy函数等等。例如
报错信息:这个函数不安全,建议使用scanf_s代替。
像这种类似的_s函数都是VS编译器提供的,换言之,VS认为C中的部分函数不安全,就推荐使用自己的函数代替。使用VS的代替函数确实能够成功运行,但是有很多缺点,比如跨平台性不好,scanf_s这个函数在别的编译器就运行不了。在解决这个问题之前,考虑一下为什么这些C函数不安全。
2.报错原因分析
VS报错是有原因的,因为这些原本的C函数不够严谨,没有做安全检查。例如:
这个代码很简单,我们先忽略第一行的预处理。就是定义一个字符数组,用scanf将敲的内容输入到a的数组里。
C是没有字符串这个类型的,字符串存在字符数组里
但这个代码没有问题吗?显然不是,a定义的数组是5个大小,当输入过多的时候程序就崩溃了,这就是所谓的不安全函数
3.解决办法
3.1 预处理
3.1.1 程序第一行添加预处理
在错误信息中,还有后面一段话的描述。如果让这个错误失效的话,使用_CRT_SECURE_NO_WARNINGS,所以最简单的方法就是在第一行加一个预处理。
#define _CRT_SECURE_NO_WARNINGS 1
就是定义_CRT_SECURE_NO_WARNINGS这个是1(真),这样就可以运行了。
3.1.2 定义预处理器
这个和添加在第一行是一样的,在项目-->属性-->C/C++-->预处理器-->预处理器定义(分号代表多个定义,将_CRT_SECURE_NO_WARNINGS复制进去)应用、确定即可,程序照样可以正常运行。
3.2 取消安全检查
预处理方法确实简单,但缺点就是每次打开新的c文件就要在第一行添加。添加倒是不麻烦,主要是每次都要故意让VS提示出错,然后才能把错误信息中_CRT_SECURE_NO_WARNINGS复制过去,要不然谁记得住啊。
所以第二种方法就出现了,在C文件-->属性-->C/C++-->SDL检查(改为否就行),这种方法运行的时候程序会有警告,但是不影响运行。这种大概意思就是把VS的安全警告取消了。
3.3 newc++file.cpp文件
这个文件里面的内容会出现在每一次打开的c文件中,例如在文件里面输入“你好”,那么每次新建.c文件的时候就会在第一行出现“你好”,当然会有语法错误哈。所以我们只要在安装好VS后,将#define _CRT_SECURE_NO_WARNINGS 1 保存到这个文件中就可以了。
找到VS的安装位置,然后VC-->vcprojectitems-->newc++file.cpp(选择用记事本打开,将#define那一串复制保存就行了)
这里可能会有两个问题,第一个是找不到newc++file.cpp文件,这个文件是在安装位置的,可能我这么说有点像百度了。很简单,大部分人都会改安装路径,但是在D盘、F盘最起码知道吧。比如我是安装在D盘,直接搜索newc++file.cpp就行了。如图
当然很多人还是选择会去百度,按照里面网友的方法可能也会成功。有一种适合找路径的方法, 先在开始菜单里面找到VS,右击文件所在位置。
我用的是2017版本,再右击文件所在位置。
然后我的是在这个页面往上翻就找到了。找到VC这个文件夹就行了,然后VC-->vcprojectitems-->newc++file.cpp,复制保存OK。
找到newc++file.cpp已经成功一半了,第二个问题就是,保存不了,很多人可能会跳出下面这个错误框。
这是因为权限不够导致的,可能还会有别的方法解决,比如下载别的编辑器等等,这我就不介绍了。为了方便,我们直接改权限就OK了。
在newc++file.cpp,右键属性,在点击安全
找到当前登录的用户名,点击编辑权限,改成完全控制就可以了。
这样保存退出,下一次登录VS,创建.c文件的时候,就会自动帮我们在第一行写入#define _CRT_SECURE_NO_WARNINGS 1 了