std::gets
来自cppreference.com
| 在标头 <cstdio> 定义
|
||
| |
(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、文件流或缓冲区读取有格式输入 (函数) | |
| 从文件流获取字符串 (函数) | |
| 写字符串到文件流 (函数) | |
gets 的 C 文档
| |