命名空间
变体
操作

std::gets

来自 cppreference.com
< cpp‎ | io‎ | c
 
 
 
 
定义在头文件 <cstdio>
char* gets( char* str );
(在 C++11 中已弃用)
(在 C++14 中已删除)

读取 stdin 到给定的字符字符串,直到找到换行符或遇到文件末尾。

内容

[编辑] 参数

str - 要写入的字符字符串

[编辑] 返回值

成功时为 str,失败时为 null 指针。

如果失败是由文件末尾条件引起的,则还会在 stdin 上设置 eof 指示器(参见 std::feof())。如果失败是由其他错误引起的,则会设置 stdin 上的 error 指示器(参见 std::ferror())。

[编辑] 注释

std::gets() 函数不执行边界检查。因此,此函数极易受到缓冲区溢出攻击。它不能安全使用(除非程序在限制了 stdin 上可能出现的环境中运行)。由于这个原因,该函数在 C++11 中被弃用,并在 C++14 中完全删除。可以使用 std::fgets() 代替。

[编辑] 示例

#include <array>
#include <cstdio>
#include <cstring>
 
int main()
{
    std::puts("Never use std::gets(). Use std::fgets() instead!");
 
    std::array<char, 16> buf;
 
    std::printf("Enter a string:\n>");
 
    if (std::fgets(buf.data(), buf.size(), stdin))
    {
        const auto len = std::strlen(buf.data());
        std::printf(
            "The input string:\n[%s] is %s and has the length %li characters.\n",
            buf.data(), len + 1 < buf.size() ? "not truncated" : "truncated", len
        );
    }
    else if (std::feof(stdin))
    {
        std::puts("Error: the end of stdin stream has been reached.");
    }
    else if (std::ferror(stdin))
    {
        std::puts("I/O error when reading from stdin.");
    }
    else
    {
        std::puts("Unknown stdin error.");
    }
}

可能的输出

Never use std::gets(). Use std::fgets() instead!
Enter a string:
>Living on Earth is expensive, but it does include a free trip around the Sun.
The input string:
[Living on Earth] is truncated and has the length 15 characters.

[编辑] 另请参见

stdin、文件流或缓冲区读取格式化输入
(函数) [编辑]
从文件流获取字符字符串
(函数) [编辑]
将字符字符串写入文件流
(函数) [编辑]
C 文档 for gets