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))
    {
        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、文件流或缓冲区读取有格式输入
(函数)
从文件流获取字符串
(函数)
写字符串到文件流
(函数)