本文主要是介绍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个字符
这篇关于scanf和scanf_s、strcpy和strcpy_s、strncpy、gets的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!