std::gets

来自cppreference.com
< cpp‎ | io‎ | c
 
 
 
 
在标头 <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 文档
close