Namespaces
Variants

gets, gets_s

From cppreference.net
< c ‎ | io
定义于头文件 <stdio.h>
char * gets ( char * str ) ;
(1) (C11 中移除)
char * gets_s ( char * str, rsize_t n ) ;
(2) (C11 起)
1) stdin 读取到由 str 指向的字符数组中,直到遇到换行符或文件结束符。在读取到数组的最后一个字符后立即写入空字符。换行符会被丢弃但不会存储在缓冲区中。
2) stdin 读取字符,直到遇到换行符或文件结束符。最多仅向 str 所指向的数组写入 n - 1 个字符,且始终写入终止空字符(除非 str 为空指针)。若找到换行符,该字符将被丢弃且不计入写入缓冲区的字符数。
以下错误在运行时被检测到,并会调用当前安装的 约束处理函数
  • n 为零;
  • n 大于 RSIZE_MAX
  • str 是空指针;
  • 在向缓冲区存储 n - 1 个字符后未遇到 endline eof
在任何情况下, gets_s 都会先完成从 stdin 读取并丢弃字符的操作(直至遇到换行符、文件结束条件或读取错误),随后才会调用约束处理程序。
与所有边界检查函数一样,仅当实现定义了 __STDC_LIB_EXT1__ 且用户在包含 <stdio.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整型常量 1 时,才保证 gets_s 可用。

目录

参数

str - 要写入从 stdin 读取的字符的字符数组
n - 可写入 str 所指向数组的最大字符数

返回值

str 成功时返回字符串指针,失败时返回空指针。

若失败由文件结束条件引起,则额外设置 eof 指示器(参见 feof() )于 stdin 。若失败由其他错误引起,则设置 error 指示器(参见 ferror() )于 stdin

注释

gets() 函数不执行边界检查,因此该函数极易受到缓冲区溢出攻击。除非程序运行在可限制 stdin 输入内容的环境中,否则无法安全使用此函数。基于此原因,该函数在 C99 标准的第三次勘误中已被弃用,并在 C11 标准中被完全移除。 fgets() gets_s() 是推荐的替代方案。

警告:切勿使用 gets()

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • K.3.5.4.1 gets_s 函数 (页: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • K.3.5.4.1 gets_s 函数 (页: TBD)
  • C11 标准 (ISO/IEC 9899:2011):
  • K.3.5.4.1 gets_s 函数 (页: 602-603)
  • C99标准(ISO/IEC 9899:1999):
  • 7.19.7.7 gets函数(页码:298)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 4.9.7.7 gets 函数

参考

stdin 、文件流或缓冲区读取格式化输入
(函数)
从文件流获取字符串
(函数)
向文件流写入字符串
(函数)
从流读取数据到自动调整大小的缓冲区,直至遇到分隔符/行结束符
(函数)
C++ 文档 关于 gets