C语言里的gets()函数
最近在看一个学生写的关于C语言算法竞赛的书,里面提到:gets()函数有缓冲区溢出漏洞,应该用scanf()读取字符串。为什么?
追问:来自手机问问谢谢你的回答。首先我觉得用scanf(%s,a);读取字符串更好吧。还有,你解释的缓冲区溢出我还是没看懂。
最近在看一个学生写的关于C语言算法竞赛的书,里面提到:gets()函数有缓冲区溢出漏洞,应该用scanf()读取字符串。为什么?
追问:来自手机问问谢谢你的回答。首先我觉得用scanf(%s,a);读取字符串更好吧。还有,你解释的缓冲区溢出我还是没看懂。
答案:对的,确实有举出漏洞。以下是个人建议,希望对楼主有所帮助。首先我们应该先认识一下gets和scanf的语法解构。如果要给一个字符串赋值,那我们可以这样做。
int a[10];
gets(a);
或是
for(i=0;i<10;i++)
scanf("%d",&a[i]);
由上我们可以看出,scanf每次只能输入一个字符,然后回车,继续循环。
而gets呢,需要把所有的字符串都输入完后回车结束。这就造成了一个问题。
如果我们输入的字符串多于10个单位呢?我们输入的“a[20]”个空间的字符。
这就可能会产生溢出漏洞。
仅代表个人建议,希望对楼主有所帮助。
大约在2005年,scanf也被证实存在缓冲区溢出漏洞,然后被标记为作废
【当然了,具体得看你用什么标准来写代码,老式的编译器应该不会有这些提示】。
现在一般都会选择用C++中更加安全的cin。
-----------------
scanf函数是不安全的,它并不会检查缓冲区,非常容易出问题。用gets的安全版本get_s,这样可以防止内存溢出,gets_s(char *bufferr,size_t SizeByCharater)有两个参数,⑴字符串缓冲区⑵可存储的最大长度