Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gets()是否已被正式弃用? 基于C++ 11,C++引用ISO/IEC 9899:99/COR.3:2007(e)来定义C库函数(每1.2〔参考文献〕/ 1)。_C++_C_Deprecated_Gets - Fatal编程技术网

gets()是否已被正式弃用? 基于C++ 11,C++引用ISO/IEC 9899:99/COR.3:2007(e)来定义C库函数(每1.2〔参考文献〕/ 1)。

gets()是否已被正式弃用? 基于C++ 11,C++引用ISO/IEC 9899:99/COR.3:2007(e)来定义C库函数(每1.2〔参考文献〕/ 1)。,c++,c,deprecated,gets,C++,C,Deprecated,Gets,基于C99 TC3的性能,gets函数已过时,不推荐使用。(根据§7.26.9/2) 我可以肯定地说, GETSH()/c>在C和C++中都被禁止了吗? 直到C++ 11实现到现在都要有一段时间。 此外,大多数编译器甚至还不完全支持C99 例如,微软公司就没有 这有关系吗?使用get的唯一方法是,已知stdin已附加到您完全控制其内容的文件。这个条件几乎不可能满足,尤其是在多进程系统上,其他进程可能会异步修改与您的程序相关的文件。因此,出于所有实际目的,任何使用gets的程序都具有未定义的行为(

基于C99 TC3的性能,
gets函数已过时,不推荐使用。
(根据§7.26.9/2)


<>我可以肯定地说, GETSH()/c>在C和C++中都被禁止了吗?

直到C++ 11实现到现在都要有一段时间。 此外,大多数编译器甚至还不完全支持C99

例如,微软公司就没有


<不,它在C和C++中都没有被禁止。

< P>这有关系吗?使用
get
的唯一方法是,已知
stdin
已附加到您完全控制其内容的文件。这个条件几乎不可能满足,尤其是在多进程系统上,其他进程可能会异步修改与您的程序相关的文件。因此,出于所有实际目的,任何使用
gets
的程序都具有未定义的行为(即,可能存在输入/环境条件,它将具有未定义的行为),特别是UB,如果您的程序具有比数据提供程序更高的权限,则可能导致权限泄露

编辑:好的,这里有一个安全使用
的方法,关于我能马上想到的唯一方法

if (feof(stdin)) gets(buf);

当然,一些有缺陷的实现(可能包括glibc…?)甚至在已经为流设置了EOF指示符的情况下也允许读取,因此…

即使是从库中删除gets()会破坏的代码,在删除之后也会比删除之前破坏得少。我想编译器供应商可能有必要将它包含在“完全符合标准”的模式中,但它可以安全使用的情况非常少,因此从“正常”构建中排除它可能是合理的。

不推荐意味着不应该使用它,将来可能会删除它。因为这两个标准都说它已经弃用了,这意味着它已经正式弃用了。

那么它已经从C11标准中完全删除了,所以我认为这是肯定的。

这有关系吗?无论如何,您都不应该使用它。手册页上说:
Never use get()。由于无法在不事先知道数据的情况下判断gets()将读取多少个字符,并且由于gets()将继续存储超过缓冲区末尾的字符,因此使用gets是极其危险的。它被用来破坏计算机安全。改用fgets()。
因此,我要说的是,不管它的官方状态如何,都不要使用它。gets()应该只用于教新程序员缓冲区溢出。我不使用它,但“危险”听起来不像参数中的“不推荐”那么强烈。许多东西都是危险的。@Cubbi:许多被错误地贴上“危险”标签的东西有正确的用途和不正确的用途,而称之为“危险”的人是基于某人以不正确的方式使用它的可能性而强加自己的判断。另一方面,
get
基本上没有正确的用法;任何对它的使用都会导致一个有缺陷的程序。它已经被所有理智的程序员弃用多年了。由于向后兼容的原因,它在系统中存在已久。这并不意味着你必须使用;事实上,你不应该使用它。对于不支持C99的MS;在我的书中,这将是贬低MS编译器的理由。@乔纳森:附带Visual C++是一个很好的C++编译器的小细节;它没有义务完全支持C99(然而,我认为在C++11中是这样的)。不赞成并不一定意味着现代编译器不支持某些东西。这并不意味着他们不应该这样做——事实上,向后兼容通常被视为一件好事。这意味着程序员不应该使用新代码中不推荐使用的内容,并且鼓励他们将其从旧代码中删除。有人可能会说输入是他们合同的一部分,但我想GIGO方法也早已过时了。@Cubbi:我认真区分了GIGO和GIUBO。哈哈,你所说的“一次安全使用”真的有什么意义吗?如果你知道stdin处于EOF,为什么还要尝试从它那里获取输入呢?@flarn2006:不,这基本上是对读取过去的EOF错误的廉价尝试。:-)