c语言——程序出现C4996:scanf 等错误的解决方法

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.c
1>h:\2020c 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.c
1>  test.vcxproj -> H:\2020C 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.c
1>  test.vcxproj -> H:\2020C 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中的方法过程。

你可能感兴趣的:(c语言——程序出现C4996:scanf 等错误的解决方法)