VS2017、VS2019等安全函数scanf_s问题:

scanf()、gets()、fgets()、strcpy()、strcat() 等都是C语言自带的函数,它们都是标准函数,但是它们都有一个缺陷,就是不安全,可能会导致数组溢出或者缓冲区溢出,让黑客有可乘之机,从而发起“缓冲区溢出”攻击。

scanf_s()、gets_s()、fgets_s()、strcpy_s()、strcat_s() 是微软自己发明的安全函数,它们仅适用于 VS,在其它编译器下无效。这些安全函数在读取或操作字符串时要求指明长度,这样一来,过多的字符就会被过滤掉,避免了数组或者缓冲区溢出。

比如scanf()与scanf_s()比较:
scanf() 在读取字符串时不会检查字符个数,它不知道数组或缓冲区到底能容纳多少个字符,例如:

char buf[5]={0};
scanf(“%s”, buf);

当用户输入abcdeABCDE这10个字符时,scanf() 会全部读取,并放入 buf 中,不过 buf 最多只能存储 5 个字符,不足以容纳用户输入的全部数据,所以多出来的 5 个字符就会使用 buf 后面的内存,而 buf 后面的内存可能没有使用权限,或者已经被别的数据占用,这就导致程序在运行时可能会出现不可预知的错误。

最要命的是,这种错误只能等到程序运行时才能检测出来,在编译期间根本无法检测;一旦检测出来只有一种后果,就是程序被操作系统终止,也就是我们常说的“程序崩溃”。

更改上面的代码,使用 scanf_s() 代替 scanf():

char buf[5] = {0};
scanf_s(“%s”, buf, 5);

scanf_s() 最后一个参数用来指明数组或者缓冲区的大小,假设它的值为 n,那么最多只允许读取 n-1 个字符(因为最后要存储’\0’),多出来的字符就不再读取了,这样就可以避免读入过多的字符。与 scanf() 相比,scanf_s() 显然更加安全。

但是,安全函数不利于大家学习,它们不但使用麻烦,而且也不被绝大多数教程采用。另外,安全函数是微软自己发明的,只适用于 VS 编译器,在其他编译器下无效。

取消强制使用安全函数:
我们通过对 VS 做适当的设置,让它不再强制使用安全函数,从而可以使用 scanf()、gets()、fgets()、strcpy()、strcat() 等C语言的标准函数去编程。

VS 之所以会提示使用安全函数,是因为它进行了SDL检查(安全性开发生命周期检查),只要将它取消就可以了。

菜单栏中选择 “项目 --> xxx属性”(或者直接按下组合键“Alt+F7”),
选择“C/C++ --> SDL检查”,将“是”改为“否”,重新运行就行了。
摘自:http://c.biancheng.net/view/473.html

VS2019安全函数scanf_s问题相关推荐

  1. 关于vs2019安全函数localtime_s()的用法

    今天在用vs2019调试c++程序时突然发现c++自己搞了一个安全函数,之前就已经出现过,只是我没有去管它,结果今晚给我Error了一堆问题,于是乎我就开始安排一波这安全函数 注意,以下文章所有的代码 ...

  2. C语言内功修炼之函数栈帧的创建与销毁(举例加图解)

    大家可能会函数栈帧不了解,可能都没有听过这个,不用着急,在理解函数栈帧之前,我们先来了解一下程序对内存使用的分区大概情况:  区域 作用 栈区(stack) 由编译器自动分配和释放,存放函数的参数值, ...

  3. C语言scanf()常见报错问题

    目录 1.提示 scanf 未申明 2.缺少 ' ; ' 错误 3.运行后窗口一闪而过 4.快捷设置以上内容 1.提示 scanf 未申明 问题症状: 我们一开始使用scanf() 都基本会遇到这样的 ...

  4. 使用C++代码创建一个Windows桌面应用程序

    下面六星教育整理使用C++代码创建一个Windows桌面应用程序,供大家学习参考. WinMain函数 Windows应用程序的唯一程序入口. 函数原型 int WINAPI WinMain { HI ...

  5. 零基础学习C++系列课程(五) 持续更新中

    目录 项目四.路由器管理系统-权限判断 第 1 节 项目需求.项目实现 第 2 节 项目精讲-string 字符串的比较 第 3 节 项目精讲-表示真假的布尔类型 第 4 节 项目精讲-C 语言字符串 ...

  6. 第1章程序设计和C语言

    本文作者:FiftyOne_77 版权声明:未经作者允许严禁转载 第1章 程序设计和C语言 1.1 什么是计算机程序 所谓程序,就是一组计算机能识别和执行的指令 1.2 什么是计算机语言 一种计算机和 ...

  7. 给出一个百分制成绩,要求输出成绩等级“A”、“B”、“C”、“D”。90分以上为“A”,81~89 分为“B”,70~79 为“C”,60~69 为“D”,60 分以下为不合格。

    给出一个百分制成绩,要求输出成绩等级"A"."B"."C"."D".90分 以上为"A",81-89 ...

  8. 计算平均数(C语言)

    #include <stdio.h> int main() {     int number;     int sum = 0;     int n = 0;     do{        ...

  9. 【C语言】实现三子棋代码

    前言 本文介绍如何使用C语言实现三子棋游戏 思路 难点在于如何实现棋盘的打印,落子,以及如何判断胜利 棋盘打印 这里棋盘打印没有硬性要求,只要可以明显区分开 三子棋:三行三列 将棋盘拆分开,其实就是由 ...

最新文章

  1. C# WinForm源码收集
  2. Android 使用ORMLite 操作数据库
  3. DVSDK/EZSDK软件框架简介
  4. CRMEB小程序安装说明
  5. SpringBoot开发案例之CountDownLatch多任务并行处理
  6. php伪静态之APACHE配置篇
  7. Linux如何修改环境变量PATH,以及系统登录时读取文件的顺序
  8. PHP oop之大讨论 --- 你究竟有无在用OOP
  9. linux 列出指定目录下所有文件的 列表集合
  10. 施乐服务器装系统闪EE,施乐7535755633755575驱动安装教程
  11. git报错the remote end hung up unexpectedlyMiB解决方法
  12. python表白爱心_python 心形动画表白(turtle)
  13. Ubuntu18.04 + 树莓派4B + wifi + 换源 +ssh + 防火墙相关 + mate桌面 + + vnc + ROS Melodic
  14. css 的 calc() 方法
  15. Spark入门之九:机器学习简介
  16. 论文阅读:Bi-Modal PMA
  17. Hadoop完全分布式搭建(在三台虚拟机中实现)
  18. catti 三笔 计算机专业,CATTI三笔经验贴:82分实务!动物科学专业研二学生
  19. [转载]三联生活周刊:12万亿财富疯狂膨胀人人都是股神
  20. 《麦肯锡笔记思考法》初步学习心得

热门文章

  1. 只会python怎么挣钱_业余学python有用吗
  2. 加载页面就触发ajax,AJAX post方法,有时会在页面加载时触发,有时不会
  3. java后端工程师平时开发或多或少会用到Intellij idea,那么它有哪些快捷键呢
  4. java枚举的特点_Java中有些好的特性(二):枚举
  5. Aspose.Words简单生成word文档
  6. 小程序居然可以用WXS模拟实现过滤器!
  7. Html5画布(canvas)实例之绘制矩形
  8. Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: jav
  9. PHP ajax跨域问题最佳解决方案
  10. Regular Exprassion--正则表达式基础