赞
踩
经常有初学者提问,VS报错不能使用scanf
函数,怎么办?
错误 1 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. d:\2020_code\c_test\test_1_2\test_1_2\test.c 8 1 test_1_2
其实VS报错的函数还有:
scanf
strcpy
strcat
sscanf
fopen
...
这些函数都是不安全的。
简单举个例子:
#include <stdio.h>
int main()
{
char arr[5] = { 0 };//arr中只有5个元素的空间
scanf("%s", arr);//这里输入的字符如果超过5个呢?怎么办?
printf("%s\n", arr);
return 0;
}
这里如果在输入框中输入的字符超过5个会怎样呢?
scanf函数照样把输入的字符全部放入arr数组,arr数组越界,栈空间被破坏,程序奔溃
如下面:
这里scanf
函数没有做空间越界的判断,所以被认为不安全。
其他几个函数也有类似的问题。
那怎么解决呢?
仔细阅读错误提示信息,我们不难发现,提示信息是这样的:
scanf
函数不安全,考虑使用scanf_s
来替换,如果不想看到错误,也可以使用_CRT_SECURE_NO_WARNINGS
.
那怎么使用呢?
在你使用不安全函数的源文件(.c)文件中的第一行,一定是第一行加上一句话:
#define _CRT_SECURE_NO_WARNINGS 1
再去编译你的代码就好了。
注:
这里给大家解释一下,为什么不是使用scanf_s
函数,因为scanf_s
函数是VS编译器提供的,你如果在代码中使用了这个函数,你的代码如果放在gcc
编译器下编译,就会不认识scanf_s
函数,这样你的代码就不具有跨平台性,而且scanf_s
的使用方式和scanf
函数也有区别,我们一般不建议初学者使用。
那以后是不是每次在.c文件中都要在第一句代码处写:#define _CRT_SECURE_NO_WARNINGS 1
呢?
可以让每一次新建的源文件中就包含这句代码。
方法:在VS的安装路劲下搜索:newc++file.cpp
这个文件,在文件中加上:
#define _CRT_SECURE_NO_WARNINGS 1
以后创建的新的.c文件中都会自动有这句代码。
注:
在不同版本的VS环境下,newc++file.cpp
这个文件的位置不同,也可能存在多个,所以建议自己多去尝试一下。
打开工程的【解决方案资源管理器】->【属性】
在属性页中:
【配置属性】->【C/C+±>预处理器】->【预处理器定义 】中增加:
_CRT_SECURE_NO_WARNINGS
,每个符号是用分号隔开的。
然后应用,确定,就好了。
这种方法,每一次项目都要设置,可能比较麻烦。
新建项目:
选择【Visual C++】->【Win32控制台应用程序】->【设置项目名称】->【设置项目位置】->【确定】
到下一页:
点击【下一步】,不是点击【完成】:
来到这个页面:
点击完成就行:
以后只会报警告,不会报错误,可以忽视这个警告。
到此为止,讲了3种实现方式,你喜欢哪一种呢?
留言告诉我哦~
全文完
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。