gets, gets_s
来自 cppreference.cn
定义于头文件 <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 读取和丢弃字符的操作,直到遇到换行符、文件结尾条件或读取错误,然后再调用约束处理函数。 与所有边界检查函数一样,只有当实现定义了 __STDC_LIB_EXT1__ 并且用户在包含 <stdio.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整数常量 1 时,才能保证
gets_s
可用。目录 |
[编辑] 参数
str | - | 一个字符数组,用于写入来自 stdin 的字符 |
n | - | 可以写入到 str 指向的数组的最大字符数 |
[编辑] 返回值
str 成功时返回,失败时返回空指针。
如果失败是由文件结束条件引起的,则还会设置 stdin 上的 eof 指示符(参见 feof())。如果失败是由其他错误引起的,则会在 stdin 上设置 error 指示符(参见 ferror())。
[编辑] 注意
gets()
函数不执行边界检查,因此此函数极易受到缓冲区溢出攻击。除非程序在限制 stdin
上可能出现的内容的环境中运行,否则不能安全使用它。因此,该函数已在 C99 标准的第三次勘误中被弃用,并在 C11 标准中完全移除。fgets() 和 gets_s()
是推荐的替代品。
警告:永远不要使用 gets()
.
[编辑] 参考
- C23 标准 (ISO/IEC 9899:2024)
- K.3.5.4.1 gets_s 函数 (页码:待定)
- C17 标准 (ISO/IEC 9899:2018)
- K.3.5.4.1 gets_s 函数 (页码:待定)
- 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 函数
[编辑] 参见
(C11)(C11)(C11) |
从 stdin、文件流或缓冲区读取格式化输入 (函数) |
从文件流获取字符字符串 (函数) | |
将字符字符串写入文件流 (函数) | |
(动态内存 TR) |
从流中读取到自动调整大小的缓冲区,直到分隔符/行尾 (函数) |
C++ 文档 关于 gets
|