Get_s 功能不工作

Get_s function not working

我的书说 get_s() 函数是 gets() 函数的更好替代方法,后者已被弃用,不应使用。但是,当我尝试使用 get_s() 函数时,它总是给我一个错误:

undefined reference to gets_s

This page says something about the gets_sISO/IEC 99中定义的函数,我不太了解它。它不应该适用于所有编译器吗?我很确定我使用的是最新版本的 MinGW 编译器。

我该如何使用这个功能?使用 gets()scanf()(而不是 scanf_s()),或 fgets() 而不是 fgets_s(),不好吗?

是的,你是对的#bumblebee gets() 函数不执行边界检查,因此该函数极易受到 buffer-overflow 攻击。它不能安全地使用(除非程序在限制可以出现在 stdin 上的环境中运行)。因此,该函数已在 C99 标准的第三次更正中弃用,并在 C11 标准中完全删除。 fgets() 和 gets_s() 是推荐的替代品。 永远不要使用 gets()。

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

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

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

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

但是,gets_s 应该仅用于此类 C11 移植原因(如果有的话)。 gets_s 是 C11 中可选 bounds-checking 接口的一部分,编译器不需要实现它。 C11标准建议改用fgets

Recommended practice
The fgets function allows properly-written programs to safely process input lines too long to store in the result array. In general this requires that callers of fgets pay attention to the presence or absence of a new-line character in the result array. Consider using fgets (along with any needed processing based on new-line characters) instead of gets_s.


请注意,gets_s 与 non-standard Visual Studio 编译器几乎没有关系,即使该编译器恰好支持此功能,就像支持 bounds-checking 接口 (__STDC_LIB_EXT1__) 做。