std::gets
来自cppreference.com
在标头 <cstdio> 定义
|
||
char* gets( char* str ); |
(C++11 中弃用) (C++14 中移除) |
|
从 stdin 读取到给定字符串,直至找到换行字符或遇到文件尾。
参数
str | - | 要写入的字符串 |
返回值
成功时为 str
,失败时为空指针。
若因文件尾条件而导致失败,则另外设置 stdin 上的文件尾指示器(见 std::feof())。若因某些其他错误而导致失败,则设置 stdin 上的错误指示器(见 std::ferror())。
注解
std::gets()
函数不进行边界检查。因此,此函数及其容易受到缓冲区溢出攻击。它无法被安全使用(除非程序运行在限制了 stdin
上可出现内容的环境)。由于这个原因,此函数于 C++11 被弃用,并于 C++14 被完全移除。可以用 std::fgets() 代替。
示例
运行此代码
#include <array> #include <cstdio> #include <cstring> int main() { std::puts("永远不要使用 std::gets()。使用 std::fgets() 代替!"); std::array<char, 16> buf; std::printf("输入字符串:\n>"); if (std::fgets(buf.data(), buf.size(), stdin)) { const auto len = std::strlen(buf.data()); std::printf( "输入字符串:\n[%s] %s且具有 %li 个字符。\n", buf.data(), len + 1 < buf.size() ? "未被截断" : "被截断", len ); } else if (std::feof(stdin)) { std::puts("错误: 已抵达 stdin 流的结尾。"); } else if (std::ferror(stdin)) { std::puts("从 stdin 读取时发生 I/O 错误。"); } else { std::puts("未知 stdin 错误。"); } }
可能的输出:
永远不要使用 std::gets()。使用 std::fgets() 代替! 输入字符串: >Living on Earth is expensive, but it does include a free trip around the Sun. 输入的字符串: [Living on Earth] 被截断且具有 15 个字符。
参阅
从 stdin、文件流或缓冲区读取有格式输入 (函数) | |
从文件流获取字符串 (函数) | |
写字符串到文件流 (函数) |