【发布时间】:2014-01-12 06:13:52
【问题描述】:
gets的声明是:
char * gets ( char * str );
注意 str 的最大尺寸的明显遗漏。
请注意,gets 与 fgets 完全不同:不仅 get 使用 stdin 作为源,但它不包括结束换行符 在结果字符串中,并且不允许指定最大大小 for str (可能导致缓冲区溢出).
还有:
最新版本的 C 标准 (2011) 明确 从其规范中删除了此功能。功能是 在 C++ 中已弃用(截至 2011 年标准,遵循 C99+TC3)。
当然,现在通常建议将fgets 替换为gets,因为它的声明如下所示:
char * fgets ( char * str, int num, FILE * stream );
它确实采用大小参数。这使它比gets 更安全。
现在,由于我不愿意花钱下载或购买C11 standard,任何人都可以阐明弃用gets 的原因以及它对未来代码的意义吗?为什么 fgets 更安全时它存在于同一个地方?为什么它只是现在被弃用了?
【问题讨论】:
-
N1570 draft 与已发布的 ISO C11 标准几乎相同。
-
@KeithThompson 谢谢你,先生。
-
我不认为这个问题主要是基于意见的,因为 C 委员会解释了为什么
gets在标准中。
标签: c language-lawyer fgets buffer-overflow gets