命名空间
变体
操作

gets, gets_s

来自 cppreference.com
< c‎ | io
 
 
文件输入/输出
类型和对象
函数
文件访问
直接输入/输出
非格式化输入/输出
getsgets_s
(直到 C11)(C11)
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)
格式化输入
(C99)(C99)(C99)(C11)(C11)(C11)     
 
在头文件 <stdio.h> 中定义
char* gets( char* str );
(1) (在 C11 中移除)
char* gets_s( char* str, rsize_t n );
(2) (自 C11 起)
1)stdin 中的字符读入 str 指向的字符数组,直到遇到换行符或文件结束。在读入数组的最后一个字符之后,立即写入一个空字符。换行符被丢弃,但不会存储在缓冲区中。
2)stdin 中读取字符,直到遇到换行符或文件结束。只将最多 n - 1 个字符写入 str 指向的数组,并且总是写入终止空字符(除非 str 是一个空指针)。如果找到换行符,它将被丢弃,并且不会计入写入缓冲区的字符数。
以下错误在运行时被检测到,并调用当前安装的 约束处理程序 函数
  • n 为零;
  • n 大于 RSIZE_MAX
  • str 是一个空指针;
  • 在向缓冲区存储 n - 1 个字符后,未遇到换行符文件结束符
在任何情况下,gets_s 首先完成从 stdin 读取和丢弃字符,直到遇到换行符、文件结束条件或读取错误,然后才调用约束处理程序。
与所有边界检查函数一样,gets_s 只有在实现定义了 __STDC_LIB_EXT1__ 并且用户在包含 <stdio.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整数常量 1 时才保证可用。

内容

[编辑] 参数

str - 要写入的 stdin 中的字符数组
n - 可以写入 str 指向的数组的最大字符数

[编辑] 返回值

成功时为 str,失败时为一个空指针。

如果失败是由文件结束条件引起的,则还会在 stdin 上设置文件结束符指示器(参见 feof())。如果失败是由其他错误引起的,则会在 stdin 上设置错误指示器(参见 ferror())。

[编辑] 注释

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

警告:切勿使用 gets().

[编辑] 参考文献

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

[编辑] 另请参阅

stdin、文件流或缓冲区中读取格式化输入
(函数) [编辑]
从文件流中获取一个字符串
(函数) [编辑]
将一个字符串写入文件流
(函数) [编辑]
从流中读取到一个自动调整大小的缓冲区,直到遇到分隔符/行尾
(函数) [编辑]
C++ 文档 for gets