gets
的声明是:
char * gets ( char * str );
请注意 str 的最大尺寸的明显遗漏。
cplusplus.com说 2 :
请注意,获取与fgets完全不同:不仅获得使用 stdin作为源,但它不包括结束换行符 在结果字符串中,不允许指定最大大小 for str(可导致缓冲区溢出)。
还有:
最新版本的C标准(2011年)已明确提出 从其规范中删除了此功能。功能是 在C ++中弃用(截至2011年标准,遵循C99 + TC3)。
现在,当然,fgets
通常被推荐为gets
的替代品,因为它的声明如下:
char * fgets ( char * str, int num, FILE * stream );
DOES 采用尺寸参数。这使它比gets
更安全。
既然我不愿意花钱去下载或购买C11 standard
,那么任何人都可以了解弃用gets
的原因及其对未来代码意味着什么?当fgets
更安全时,为什么它存在于同一个地方?为什么只是刚刚被弃用?
答案 0 :(得分:7)
gets
已被弃用,因为它不安全,正如您已经引用的那样,它可能会导致缓冲区溢出。对于替换,C11提供了一个替代gets_s
,其签名如下:
char *gets_s(char *s, rsize_t n);
请注意,C11仍建议fgets
替换gets
。
首先将gets
置于标准中是否存在争议,但委员会认为gets
在程序员对输入有足够控制权时很有用。
以下是委员会的官方解释。
Rationale for International Standard - Programming Languages C§7.19.7.7
gets
函数:因为
gets
没有检查缓冲区溢出,所以当它的输入不在程序员的控制之下时,使用它通常是不安全的。这导致一些人质疑它是否应该出现在标准中。委员会认为,gets
在程序员对输入有足够控制的特殊情况下是有用和方便的,而且作为长期存在的做法,它需要一个标准规范。但是,一般来说,首选函数是fgets
(见第7.19.7节)。
答案 1 :(得分:2)
既然我不愿意花钱购买下载或购买C11标准,那么任何人都可以了解弃用获取的原因及其对未来代码的意义吗?
C99委员会理由:
因为gets不检查缓冲区溢出,所以当它的输入不在程序员的控制之下时,使用它通常是不安全的。这导致一些人质疑它是否应该出现在标准中。委员会认为,在程序员对输入有足够控制的情况下,在特殊情况下,获取是有用和方便的,并且作为长期存在的实践,它需要标准规范。然而,一般来说, 首选功能是fgets。