0

我的书说该get_s()功能是该功能的更好替代品,该gets()功能已弃用且不应使用。但是,当我尝试使用该get_s()功能时,它总是给我一个错误:

undefined reference to gets_s

此页面说明了有关 gets_s 的一些信息,我并不真正了解它在ISO/IEC 99. 它不应该适用于所有编译器吗?我很确定我使用的是最新版本的 MinGW 编译器。

我应该如何使用这个功能?使用gets()or scanf()(而不是scanf_s())或fgets()overfgets_s()不好?

4

2 回答 2

2

是的,你是对的 #bumblebee gets() 函数不执行边界检查,因此该函数极易受到缓冲区溢出攻击。它不能安全使用(除非程序在限制标准输入上出现的内容的环境中运行)。出于这个原因,该功能已在 C99 标准的第三次勘误中被弃用,并在 C11 标准中完全删除。fgets() 和 gets_s() 是推荐的替代品。永远不要使用gets()。

来源:http ://en.cppreference.com/w/c/io/gets 检查天气,您包含相应的标题。还有一件事你必须看到的是,天气你的 c 编译器版本是更新版本或旧版本,也会产生问题。所以尝试使用 c11 标准或 c11 在线编译器

于 2017-02-20T05:40:46.247 回答
0

在 90 年代初期左右,gets()它被发现存在设计缺陷,因为它会一直读取数据,直到找到字符串的结尾,这意味着它可能会意外或通过安全漏洞导致缓冲区溢出。

因此gets在 C99 标准中被标记为过时的功能。这意味着从 1999 年开始,人们被警告不要使用它。

该功能已从 C11 标准中的语言中完全删除,这意味着有不少于 12 年的非常慷慨的过渡期来修复遗留代码。它被替换为gets_s, 作为将旧代码移植到 C11 时使用的安全替代方案。它将缓冲区大小作为第二个参数。

但是,gets_s如果有的话,应该只用于此类 C11 移植原因。gets_s是 C11 中可选边界检查接口的一部分,编译器不需要实现它。C11 标准建议fgets改用:

推荐实践fgets
函数允许正确编写 的程序安全地处理输入行太长而无法存储在结果数组中。一般来说,这要求 fgets 的调用者注意结果数组中是否存在换行符。考虑使用fgets(以及基于换行符的任何需要的处理)而不是gets_s


请注意,gets_s这与非标准 Visual Studio 编译器几乎没有关系,即使该编译器恰好支持此功能,就像支持边界检查接口 ( __STDC_LIB_EXT1__) 的符合标准的编译器一样。

于 2017-02-20T15:49:01.083 回答