来自cplusplus.com
C标准的最新修订(2011年)从规范中删除了此功能
该函数在C++中已弃用(自2011年标准起,如下所示C99+TC3)。
我只是想知道C11标准中gets()
的替代方案是什么?
在C11中,gets
已被具有以下声明的gets_s
取代:
char *gets_s(char *str, rsize_t n);
此函数将最多从stdin
读取n-1
个字符到*str
。这是为了避免gets
固有的缓冲区溢出漏洞。函数fgets
也是一个选项。从…起http://en.cppreference.com/w/c/io/gets:
gets()函数不执行边界检查,因此此函数极易受到缓冲区溢出攻击。它无法安全使用(除非程序在限制stdin上显示内容的环境中运行)。由于这个原因,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指向的数组。没有其他在换行符(已丢弃)或文件结束后读取字符。丢弃的换行符不计入读取的字符数。A.null字符在读取到数组中的最后一个字符之后立即写入。
如果遇到文件结尾并且没有将任何字符读入数组,或者如果操作过程中发生错误,然后s[0]被设置为null字符,另一个s的元素采用未指定的值。
您可以使用fgets
或gets_s
:
http://www.java2s.com/Code/C/Console/Usefgetstoreadstringfromstandardinput.htm
根据man 3 gets
、fgets
。