什么是C11中的gets()等价物?

来自cplusplus.com

最新版本的C标准(2011年)明确地将此function从其规范中删除

该函数在C ++中已弃用(截至2011年标准,遵循C99 + TC3)。

我只是想知道C11标准中gets()的替代方法是什么?

在C11中, gets has已被具有以下声明的gets_s替换:

 char *gets_s(char *str, rsize_t n); 

此函数将从stdin读取最多n-1字符到*str 。 这是为了避免获得的缓冲区溢出漏洞。 函数fgets也是一个选项。 来自http://en.cppreference.com/w/c/io/gets :

gets()函数不执行边界检查,因此该函数极易受到缓冲区溢出攻击。 它不能安全使用(除非程序在限制stdin上出现的内容的环境中运行)。 因此,该function已在C99标准的第三个更正中弃用,并在C11标准中完全删除。 fgets()gets_s()是推荐的替代品。

永远不要使用gets()

鉴于gets_s是在标准的扩展中定义的,只有可选的实现,你应该使用fgets编写你的程序。 如果在stdin上使用fgets ,程序也会在早期版本的C中编译。但请记住行为的不同之处:当gets_s读取n-1字符时, 它会一直读取,直到达到新行或文件结尾为止 ,丢弃输入。 因此,使用gets_s您总是读取整行,即使只有一部分可以在输入缓冲区中返回。

其他人已经回答了这个问题。 为了完整起见,这是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的其他元素采用未指定的值。

根据man 3 getsfgets