当前位置:编程学习 > C/C++ >>

C语言里的gets()函数

最近在看一个学生写的关于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)有两个参数,⑴字符串缓冲区⑵可存储的最大长度

上一个:解决一个问题 谢谢了 用C语言
下一个:全部2000分 求c语言高手 帮我 c语言实训

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,