c语言——程序出现C4996:scanf 等错误的解决方法(不用scanf_s替换解决)
问题实例解决方法方法1方法2在VS编译器下,编写的c语言程序在调试编译时可能会出现c4996警告或错误此类的反馈信息,在此根据自己的实践经验总结出了几个可以解决此类问题的方法。以下通过具体的例子进行叙述。
问题实例
下面展示一段简单的代码`:
int main(){int age = 0;printf("请输入你的年龄:>");scanf("%d",&age);printf("你输入的年龄是:%d\n",age);return 0;}
调试运行出现错误或警告提示:
1>------ 已启动生成: 项目: test, 配置: Debug Win32 ------1> test.c1>h:\c c++学习\classcode\test\test\test.c(24): 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.1> c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\stdio.h(1270): note: 参见“scanf”的声明========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
提示中说到用scanf_s去替换scanf可以解决问题,因此根据提示将代码中的scanf替换为scanf_s,调试后结果为:
1>------ 已启动生成: 项目: test, 配置: Debug Win32 ------1> test.c1> test.vcxproj -> H:\C C++学习\ClassCode\test\Debug\test.exe========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
可见这种方法确实可以解决问题。
但是,实际上scanf是c语言提供的函数,防范使用大多数的编译器,而scanf_s这个函数只是VS编译器提供的一个它自身认为安全的一个版本,在其他编译器下不一定适用,不建议使用。
解决方法
方法1
在报错的提示中提到:
To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
因此,源程序的最开头(头文件之前)加上一句代码:
#define _CRT_SECURE_NO_WARNINGS 1
调试编译后,问题解决:
1>------ 已启动生成: 项目: test, 配置: Debug Win32 ------1> test.c1> test.vcxproj -> H:\C C++学习\ClassCode\test\Debug\test.exe========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
为了避免在每次编写程序是都要认为地去添加上述一行代码,以下提供了使建立添加生成的源文件自动生成上述一行代码的方法:
自己安装的visual studio 路径--------->找到Microsoft Visual Studio 14.0并点击------->点击VC---------->点击vcprojectitems----------->右击new++file.cpp,用Notepad++打开--------->在文件中添加#define _CRT_SECURE_NO_WARNINGS 1并保存。以后新建的**.c文件只能够都会出现上述代码,可解决c4996出现的scanf、strcpy、strcat此类函数警告或报错的问题。
方法2
与方法1类似,在头文件之前添加以下一行代码也可解决问题:
#pragma warning(distable:4996)
若想让新建的.c文件自动出现上述一行代码,方法参看方法1中的方法过程。