gets, gets_s
来自cppreference.com
在标头 <stdio.h> 定义
|
||
char* gets( char* str ); |
(1) | (C11 中移除) |
char* gets_s( char* str, rsize_t n ); |
(2) | (C11 起) |
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 (第 TBD 页)
- C17 标准(ISO/IEC 9899:2018):
- K.3.5.4.1 The gets_s function (第 TBD 页)
- C11 标准(ISO/IEC 9899:2011):
- K.3.5.4.1 The gets_s function (第 602-603 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.19.7.7 The gets function (第 298 页)
- C89/C90 标准(ISO/IEC 9899:1990):
- 4.9.7.7 The gets function
参阅
(C11)(C11)(C11) |
从stdin、文件流或缓冲区读取格式化输入 (函数) |
从文件流获取一个字符串 (函数) | |
将一个字符串写入文件流 (函数) | |
(动态内存 TR) |
从流读入至动态改变大小的缓冲区,直到分隔符/行尾 (函数) |