scanf和scanf_s、strcpy和strcpy_s、strncpy、gets
来源:互联网 发布:下载自选股软件 编辑:程序博客网 时间:2024/04/29 15:33
在使用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 0
- scanf和scanf_s、strcpy和strcpy_s、strncpy、gets
- strcpy和strcpy_s和strncpy
- strncpy,strncpy_s和strcpy,strcpy_s
- scanf_s和scanf区别
- scanf和scanf_s
- 再论strcpy和strcpy_s
- strcpy_s和strcpy()
- strcpy_s和strcpy()函数
- strcpy和strcpy_s
- strcpy strcpy_s strncpy
- strcpy/strncpy/strcpy_s比较
- strcpy/strncpy/strcpy_s比较
- strcpy/strncpy/strcpy_s比较
- strcpy/strncpy/strcpy_s比较
- strcpy() strncpy() strcpy_s()
- strcpy/strncpy/strcpy_s比较
- C++ strcpy strcpy_s strncpy strlcpy
- strcpy 和 strncpy
- curl调用Jenkins API控制job
- C++第一次上机
- 怎么将ojdbc5放入maven仓库
- AS新建项目上传coding
- 织梦dedecms制作单页或者封面页的方法
- scanf和scanf_s、strcpy和strcpy_s、strncpy、gets
- spring cache 与redis缓存整合
- C++第1次上机实验-C++程序的编写和运行
- JavaScript获取一个区间的随机数
- struts2 实现图片验证码 jsp annocation
- 欢迎使用CSDN-markdown编辑器
- 浏览器窗口、网页尺寸
- mongodb 存储经纬度以及查询
- uLua记录———函数调用