最新版本的C标准(2011年)已明确提出 从其规范
中删除了此功能该函数在C ++中已弃用(截至2011年标准,如下) C99 + TC3)。
我只是想知道C11标准中gets()
的替代方案是什么?
答案 0 :(得分:14)
在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()函数不执行边界检查,因此该函数极易受到缓冲区溢出攻击。它不能安全使用(除非程序在限制stdin上可能出现的内容的环境中运行)。因此,该功能已在C99标准的第三个更正中弃用,并在C11标准中完全删除。 fgets()和 gets_s()是推荐的替代品。
绝不使用 gets()。
鉴于gets_s
是在标准的扩展中定义的,只有可选的实现,您应该使用fgets
来编写程序。如果您在fgets
上使用stdin
,您的程序也会在早期版本的C中编译。但请记住行为的差异:gets_s
读取n-1
个字符时< strong>它一直读取直到达到新行或文件结尾,丢弃输入。因此,对于gets_s
,您总是读取整行,即使只有一部分可以在输入缓冲区中返回。
答案 1 :(得分:8)
其他人已经回答了这个问题。为了完整起见,这是C标准的建议:
ISO9899:2011 K.3.5.4.1 / 6
推荐做法
fgets功能允许正确编写的程序安全地处理输入行太长而无法存储在结果中 阵列。一般来说,这需要fgets的来电者注意 结果数组中是否存在换行符。 考虑使用fgets(以及基于的任何所需处理) 新行字符)而不是gets_s。
所以你应该尽可能使用 fgets 。
修改强>
gets_s行为被指定为:
ISO9899:2011 K.3.5.4.1 / 4
说明
gets_s函数最多读取一个小于n指定的字符数 从stdin指向的流进入s指向的数组。没有额外的 在换行符(被丢弃)之后或文件结束之后读取字符。 丢弃的换行符不计入读取的字符数。一个 在读入数组的最后一个字符后立即写入空字符。
如果遇到文件结尾,并且没有字符读入数组,或者读取 在操作期间发生错误,然后s [0]被设置为空字符,而另一个 s的元素采用未指定的值。
答案 2 :(得分:6)
答案 3 :(得分:4)
根据man 3 gets
,fgets
。