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)){constauto len =std::strlen(buf.data());std::printf("输入字符串:\n[%s] %s且具有 %li 个字符。\n", buf.data(), len +1< buf.size()?"未被截断":"被截断", len );}elseif(std::feof(stdin)){std::puts("错误: 已抵达 stdin 流的结尾。");}elseif(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 文档 |