C语言‘scanf‘函数deprecation报错:This function or variable may be unsafe.

在Visual Studio 2019中尝试运行C语言程序时,遇到错误C4996,提示scanf函数不安全,建议使用scanf_s代替。该错误是由于旧版输入输出函数的安全性问题引发。解决方法是关闭项目的SDL(Security Development Lifecycle)检查,通过项目属性设置将“SDL检查”选项设为“否(/sdl-)”。完成设置后,程序成功运行。

笔者在VS2019上运行C语言程序:
数字复读机小程序:
scanf(“I say %d”, &number)的第二个参数传入了前面定义的整型number在计算机中内存的位置,然后把第一个参数匹配到的整型数据写入此内存地址中。(%d中的“%”表示匹配,d表示整型。)

#include <stdio.h>
int main() {
    int number;
    number = 32;
    scanf("I say %d", &number);     #   &number中的&为取地址符(address-of operator)
    printf("Computer says %d", number);
    return 0;
}

时候遇到报错:

错误	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.	
C_Language	D:\C_Language\hello.c	5	

原因:scanf这类在学习过程中遇到的函数比较旧了,不太安全,所以报警。

解决方法:取消项目的SDL检查即可。
工具栏上选择“项目”:
在这里插入图片描述
点“属性”,弹出的对话框选择“C/C++”,在右侧把“SDL检查”一项选为“否(/sdl-)”即可。
在这里插入图片描述
修改后,按F5运行成功。
在这里插入图片描述

在C语言编程中,使用 `scanf` 函数时遇到错误提示 **error C4996: 'scanf': This function or variable may be unsafe** 是由于 Microsoft 的编译器对标准 C 库函数进行了安全性增强检查。该警告提示用户 `scanf` 函数可能存在缓冲区溢出的风险,尤其是在处理字符串输入时容易导致越界访问[^1]。 ### 问题原因 `scanf` 在读取字符串时不会自动检查目标数组的边界,如果用户输入超过数组容量,会导致未定义行为,例如程序崩溃或安全漏洞[^2]。例如: ```c char ch[5]; scanf("%s", ch); // 如果输入超过4个字符(留一个给字符串结束符),将导致越界 ``` ### 解决方案 #### 方法一:使用更安全的替代函数 `scanf_s` Microsoft 提供了安全版本的输入函数 `scanf_s`,它要求在读取字符串或数组时指定最大长度限制,从而避免缓冲区溢出: ```c char ch[10]; scanf_s("%s", ch, (unsigned)_countof(ch)); // _countof(ch) 返回数组元素个数 ``` 其中 `(unsigned)_countof(ch)` 是 Microsoft 特有的宏,用于获取数组大小,确保输入不超过数组容量[^1]。 #### 方法二:禁用安全警告(不推荐) 可以在代码顶部添加以下预处理器定义,以禁用所有与“不安全函数”相关的警告: ```c #define _CRT_SECURE_NO_WARNINGS ``` 或者在 Visual Studio 的项目属性中设置预处理器定义: - 打开项目属性页(右键项目 -> 属性) - 转到【C/C++】->【预处理器】 - 在【预处理器定义】中添加 `_CRT_SECURE_NO_WARNINGS` 这种方法虽然简单,但会降低程序的安全性,因此不建议作为首选方案[^3]。 #### 方法三:手动控制输入长度 即使使用 `scanf`,也可以通过格式化字符串来限制输入长度: ```c char ch[10]; scanf("%9s", ch); // 最多读取9个字符,保留1个位置给 '\0' ``` 这种方式可以有效防止缓冲区溢出,同时保持代码的可移植性[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值