C语言数值交换程序中为何要使用scanf_s代替scanf?
问题解答
为什么优先使用scanf_s而非scanf
scanf_s是微软为C标准库扩展的安全增强型输入函数,属于「安全CRT函数」系列。原生scanf不会对输入内容做边界校验,遇到格式不匹配或者恶意构造的超长输入时,很容易触发缓冲区溢出问题,轻则程序崩溃,重则可能被注入恶意代码执行;scanf_s则要求开发者在读取字符串等可变长内容时额外传入缓冲区长度参数,从语法层面降低了溢出风险。- 微软系编译器(最常见的是Visual Studio)默认开启了安全编译校验规则,会直接将原生
scanf标记为废弃的不安全函数,要求开发者使用scanf_s这类安全函数替代。
本次程序报错的原因
你当前的开发环境应该是Visual Studio这类微软出品的C/C++编译器,默认开启了/SDL(安全开发生命周期)检查选项:
- 只要代码中出现
scanf、gets这类被标记为存在安全隐患的函数,且没有提前定义_CRT_SECURE_NO_WARNINGS宏关闭安全检查,编译器就会直接抛出编译错误。 - 你的代码中
main函数用了符合要求的scanf_s,但自定义的swap函数中仍使用了原生scanf,因此触发了编译器的安全校验规则,导致报错。
补充:如果你使用GCC、Clang等非微软系编译器,并不会强制要求使用
scanf_s,原生scanf可以正常编译运行,该限制是微软编译器特有的规则。如果非要在微软编译器中使用scanf,只需要在所有头文件引入前添加一行#define _CRT_SECURE_NO_WARNINGS即可关闭该报错。
内容的提问来源于stack exchange,提问作者J P
相关产品推荐
相关产品推荐

