20

来自cplusplus.com

C 标准 (2011) 的最新版本已明确从其规范中删除了此功能

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

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

4

4 回答 4

16

在 C11gets中已被替换为gets_s具有以下声明:

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

此函数将最多从into读取n-1字符。这是为了避免. 该功能也是一种选择。从http://en.cppreference.com/w/c/io/getsstdin*strgetsfgets

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

永远不要使用gets()

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

于 2012-10-15T10:39:55.267 回答
8

其他人已经回答了这个问题。为了完整起见,这是 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

描述

get_s 函数从 stdin 指向的流中最多将 n 指定的字符数少一个,读入 s 指向的数组中。在换行符(被丢弃)或文件结尾之后不会读取其他字符。丢弃的换行符不计入读取的字符数。在读入数组的最后一个字符之后立即写入一个空字符。

如果遇到文件结尾并且没有字符被读入数组,或者在操作过程中发生读取错误,则将 s[0] 设置为空字符,并且 s 的其他元素采用未指定的值。

于 2012-10-15T13:55:24.410 回答
6

您可以使用fgetsgets_s

http://www.java2s.com/Code/C/Console/Usefgetstoreadstringfromstandardinput.htm

于 2012-10-15T10:37:40.037 回答
4

man 3 getsfgets

于 2012-10-15T10:35:51.897 回答