最新版的C标准(2011)已经从其规范中明确删除了此函数。
C++中的此函数已被弃用(从2011年标准开始,遵循C99+TC3)。
我只是想知道C11标准中替代gets()
的方法是什么?
最新版的C标准(2011)已经从其规范中明确删除了此函数。
C++中的此函数已被弃用(从2011年标准开始,遵循C99+TC3)。
我只是想知道C11标准中替代gets()
的方法是什么?
在C11中,gets
已被替换为具有以下声明的gets_s
:
char *gets_s(char *str, rsize_t n);
该函数将最多读取 n-1
个字符从 stdin
到 *str
中,以避免 gets
内在的缓冲区溢出漏洞。此外,fgets
函数也是一种选择。根据http://en.cppreference.com/w/c/io/gets:
gets() 函数不执行边界检查,因此此函数极易受到缓冲区溢出攻击。除非程序在限制输入的环境中运行,否则不能安全使用此函数。因此,在 C99 标准的第三次勘误中已将该函数弃用,并在 C11 标准中将其完全删除。应使用 fgets() 和 gets_s() 来替换。
绝对不要使用 gets()。
鉴于 gets_s
在标准扩展中定义,只是可选实现的,您应该使用 fgets
来编写程序。如果您在 stdin
上使用 fgets
,那么您的程序也将在早期版本的 C 中编译。但请记住行为上的差异:当 gets_s
读取 n-1
个字符后,它会继续读取直到达到新行或文件结尾,而将输入丢弃。因此,使用 gets_s
您总是在读取整行,即使只有部分内容可以返回到输入缓冲区中也是如此。
n-1
个字符内既没有换行符又没有 EOF,则 gets_s()
函数将报告约束违规,读取超长的行是错误的。请确保输入不会超过缓冲区大小,以避免这种情况的发生。 - Jonathan Lefflerfgets
或 gets_s
来读取字符串:
http://www.java2s.com/Code/C/Console/Usefgetstoreadstringfromstandardinput.htm
man 3 gets
,fgets
函数。
__STDC_LIB_EXT1__
,则gets_s
是可选的,可以不出现;如果实现定义了__STDC_LIB_EXT1__
,则需要定义__STDC_WANT_LIB_EXT1__
为1,否则在相应的头文件中是否包含K附录中的函数是由实现定义的。 - Daniel Fischerfgets
函数。gets_s
函数是一个可选的接口,仅存在于 Windows 平台,并且仅因政治原因在标准中被提及。除 Microsoft 以外的大部分人都认为_s
接口是误导性和有害的。据报道,某些或所有_s
接口的标准行为甚至与唯一现有的实现(Microsoft 的实现)不同,使得它们的使用更加有害。 - R.. GitHub STOP HELPING ICE