在我看来,两者都有可能导致缓冲区溢出。但是我被建议不要使用gets(),但仍然鼓励使用scanf()。
这是因为scanf()允许格式化参数,还是有其他原因呢?
在我看来,两者都有可能导致缓冲区溢出。但是我被建议不要使用gets(),但仍然鼓励使用scanf()。
这是因为scanf()允许格式化参数,还是有其他原因呢?
gets
函数没有受到缓冲区溢出的保护。
使用 scanf
格式字符串,您可以定义从标准输入读取并存储在给定内存缓冲区中的字符串的最大长度。例如,使用 scanf("%10s\n", str);
将读取最多 10 个字符。需要将 str
缓冲区大小设置为 11 字节以存储 NULL 结束符。
就性能而言,如果您只是使用 scanf
来解决 gets
的缓冲区溢出问题,请优先使用 fgets
函数。
scanf
和 gets
(或 fgets
)并不涵盖相同的用例。你使用 fgets
从输入流中读取一行。你使用 scanf
解析输入流中的数据。话虽如此,你可以使用 scanf
从输入流中读取一行,就像使用 fgets
一样,但这会导致性能损失。 - greydetgets
和 scanf
之间的区别。 - Fred Foo仍然鼓励使用scanf()。
快速搜索“scanf安全性”会出现约212k个结果。第一个是维基百科,其中指出:
不带长度说明符的%s占位符的用法本质上是不安全的,并且容易受到缓冲区溢出的攻击。
因此,在网络上有足够的关于scanf安全性的信息。与gets的区别在于,scanf具有安全用途,而使用gets几乎总是不明智的。
scanf
更安全。 - jamesdlin
gets()
函数无法过滤掉末尾的换行符。 - noMADgets()
函数在没有遇到换行符\n
时不会返回输入的内容,而是返回EOF
。 - pampeho