scanf和scanf_s、strcpy和strcpy_s、strncpy、gets

在使用vs的时候,使用scanf和strcpy以及gets函数都会报错,说这几个函数存在安全问题。下面来看看到底会出现什么问题,以及安全的函数该如何写。
1、scanf和scanf_s
scanf在读取的时候不检查边界,可能造成内存访问越界,例如分配了5个字节的空间,但是读入了7个字节。

char str[5]={'\0'};
scanf("%s",str);
如果输入为7个字节1234567,那么后面的67都会被写到别的空间去。
#scanf_s("%s",str,5);
最多读取4个字节,最后一个参数表示缓冲区大小,表示最多读取多少个字节。

2、strcpy和strcpy_s
strcpy依据源字符串的’\0’作为结束标志的,不检查目标位置的大小,如果目标不够就会产生溢出问题。

char str[5];
strcpy(str,"hello world");
像这样就会产生溢出问题
strcpy_s(str,12,"hello world");
很奇怪的是打印出来的str居然是hello world,而且这么用在vs中也会出现错误,可以去试试。
第二个参数表示目标缓冲区大小,但又必须大于等于源字符串长度+1(结尾放'\0'),所以这个函数只能完全拷贝源串。要想部分拷贝只能用strncpy_s。

3、strncpy_s
这个函数可以部分拷贝。

char str[5];
strncpy_s(str,5,"hello world",4);
表示从源拷贝4个字节到5个字节的目标空间

4、gets
gets不检查字符串的大小,必须遇到换行符或文件结尾才会结束输入,容易造成缓存溢出的安全问题,可以用fgets代替。

char str[5];
fgets(str,6,stdin);
表示从键盘读入5个字符
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值