在 VS(Visual Studio)下编译C语言程序,有时候VS会报错,提示用到的一些函数可能不安全,并且建议替换为带有_s后缀的安全函数。

安全函数是什么

scanf()、gets()、fgets()、strcpy()、strcat() 等都是C语言自带的函数,它们都是标准函数,但是它们都有一个缺陷,就是不安全,可能会导致数组溢出或者缓冲区溢出,让黑客有可乘之机,从而发起“缓冲区溢出”攻击。scanf_s()、gets_s()、fgets_s()、strcpy_s()、strcat_s() 等是微软自己发明的安全函数,它们仅适用于 VS,在其它编译器下无效。这些安全函数在读取或操作字符串时要求指明长度,这样一来,过多的字符就会被过滤掉,避免了数组或者缓冲区溢出。

最简单粗暴的方法,关掉它

安全函数是微软自己发明的,只适用于 VS 编译器,在其他编译器下无效,感觉不利于我们学习。

关掉SDL检查或者在程序开头(就是在#include <stdio.h>之类的前面)加上下面2条命令中的一个都可以关闭安全函数

#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_WARNINGS

部分安全函数用法

scanf_s()

下面2种用法都可以

scanf_s("%d", &a);
scanf_s("%s", str, n);//最多只允许读取 n-1 个字符(因为最后一个要存储’\0’)

fopen_s()

FILE *fp;
errno_t err;
err= fopen_s(&fp, "1.txt", "r");

strcat_s()

char str1="abcd";
char str2="efgh";
char *ret=(char *)malloc(120);
memset(ret, 0, sizeof(ret));//初始化字符串
int len1=strlen(str1)+1;
strcat_s(ret, len1, str1);//第2个参数是合并字符串后的字符数量,即源串大小+目标串大小+字符串结束符大小("\0")
int len2=strlen(ret)+strlen(str2)+1;
strcat_s(ret, len2, str2);
printf("%s", ret);

最新文章

  1. Ubuntu常用命令之update-alternatives
  2. Python开发入门与实战17-新浪云部署
  3. zookeeper是什么?原理是什么?【转】
  4. 【网络】ssl与ssh
  5. STM32学习笔记(九) 外部中断,待机模式和事件唤醒
  6. vim自定义配色方案,图文并茂
  7. ubuntu安装到选择位置时闪退
  8. Android编程: 环境搭建、基本知识
  9. 卸载CentOS 5.4自带的OpenJDK,配置新的Java环境
  10. HW5.24
  11. CSRedisCore 在net core中的使用
  12. django模板导入外部js和css等文件
  13. curl 发送 post 请求
  14. [svc]sort-uniq
  15. nodejs sequelize 对应数据库操作符的定义
  16. PostgreSQL 之 yum安装 postgis 插件
  17. JAVA框架 Spring AOP--切入点表达式和通知类型
  18. FileOutputSteam入门
  19. 解决Android 5.0中出现的警告:Service Intent must be explicit
  20. linux下清空c++ cin无效流的方式

热门文章

  1. 第二章 单表查询 T-SQL语言基础(3)
  2. nginx配置详解和原理
  3. vue typescript curd
  4. android app 闪屏
  5. SSH中直接运行php文件
  6. vsftpd 添加用户
  7. windows下前端开发环境配置
  8. 使用GDI+加载32位的位图或者PNG图片(具有透明通道)
  9. 【洛谷P4552】IncDec Sequence
  10. 【JZOJ5430】【NOIP2017提高A组集训10.27】图