Spec-Zone.ru › C++

std::gets

Определено в заголовке <cstdio>
char* gets( char* str );
(устарело в C++11)
(удалено в C++14)

Читает stdin в заданную строку символов до тех пор, пока не встретится символ новой строки или не произойдёт конец файла.

Параметры

str - строка символов для записи

Возвращаемое значение

str при успехе, нулевой указатель при ошибке.

Если ошибка вызвана условием конца файла, дополнительно устанавливается флаг eof (см. std::feof()) для stdin. Если ошибка вызвана какой-либо другой ошибкой, устанавливается флаг error (см. std::ferror()) для stdin.

Примечания

Функция 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.

См. также

scanffscanfsscanf
считывает форматированный ввод из stdin, потока файла или буфера
(функция)
fgets
получает строку символов из потока файла
(функция)
fputs
записывает строку символов в поток файла
(функция)
Документация C для gets

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/c/gets

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API