我遇到了问题。我想看看获取和 scanf()之间的区别。但是,我的终端显示为::
警告:此程序使用gets(),这是不安全的。 中止陷阱:6
是否存在一些规则,其中gets()和scanfs()无法在一个代码中聚集在一起?
#include <stdio.h>
int main(void){
char passage[10];
printf("Enter in a passage same one twice:: \n");
scanf("%s", passage);
gets(passage);
printf("Using scanf:: %s", passage);
printf("Using Gets:: %s", passage);
}
P.S。人们说我目前正在写我不拥有的内存,但我没有在这段代码中遇到问题。感谢!!!
答案 0 :(得分:2)
gets()
容易受到缓冲区溢出的影响,因此非常不鼓励。此漏洞来自于无法指定传递给gets()
的缓冲区实际大小的事实。在你的情况下,通道是10个字符长,想象一下,如果用户键入10个或更多字符。然后,缓冲区将开始指向未分配的内存,并导致基于堆栈的缓冲区溢出。
您的编译器正在使用的C库似乎试图阻止您编译易受攻击的代码。如果您仍想使用gets()
,请改用fgets()
并将文件指针设置为stdin。 fgets()
的优点是它允许您指定缓冲区大小。详细了解fgets()
here。
更新:请注意MikeCAT对此帖子的评论,引用了scanf("%s")
在您使用它时的危险。
答案 1 :(得分:1)
它没有一起使用gets和scanf,它正在使用获取所有。获取(http://man7.org/linux/man-pages/man3/gets.3.html)的联机帮助页说它比我更好:
永远不要使用gets()。因为在不事先知道数据的情况下无法判断get()将读取多少个字符,并且因为gets()将继续存储超出缓冲区末尾的字符,所以使用它是非常危险的。它已被用来打破计算机安全。请改用fgets()。有关更多信息,请参阅http://cwe.mitre.org/data/definitions/242.html
上的CWE-242(又名“使用固有危险函数”)
答案 2 :(得分:0)
基本区别[参考您的特定情况],
scanf() ends taking input upon encountering a whitespace, newline or EOF
gets() considers a whitespace as a part of the input string and ends the input upon encountering newline or EOF.
However, to avoid buffer overflow errors and to avoid security risks, its safer to use fgets().