Spec-Zone.ru › C

gets, gets_s

Определено в заголовочном файле <stdio.h>
char* gets( char* str );
(1) (удалена в C11)
char* gets_s( char* str, rsize_t n );
(2) (начиная с C11)
1) Считывает stdin в символьный массив, на который указывает str, до обнаружения символа новой строки или достижения конца файла. Сразу после последнего считанного в массив символа записывается нулевой символ. Символ новой строки отбрасывается и не сохраняется в буфере.
2) Считывает символы из stdin до обнаружения символа новой строки или достижения конца файла. Записывает в массив, на который указывает str, не более n - 1 символов и всегда записывает завершающий нулевой символ (если только str не является нулевым указателем). Обнаруженный символ новой строки отбрасывается и не учитывается при подсчёте символов, записанных в буфер.
Во время выполнения обнаруживаются следующие ошибки, при возникновении которых вызывается установленная в данный момент функция обработчика ограничений:
  • n равен нулю;
  • n больше RSIZE_MAX;
  • str является нулевым указателем;
  • после записи n - 1 символов в буфер не обнаружены конец строки или конец файла.
В любом случае gets_s сначала завершает чтение и отбрасывает символы из stdin до появления символа новой строки, достижения конца файла или возникновения ошибки чтения, а затем вызывает обработчик ограничений.
Как и для всех функций с проверкой границ, гарантируется доступность gets_s только в том случае, если реализация определяет __STDC_LIB_EXT1__ и пользователь перед включением <stdio.h> определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1.

Параметры

str - символьный массив, в который записываются символы из stdin
n - максимальное количество символов, которое можно записать в массив, на который указывает str

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

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

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

Примечания

Функция gets() не выполняет проверку границ, поэтому крайне уязвима для атак с переполнением буфера. Её нельзя использовать безопасно (если только программа не выполняется в среде, ограничивающей содержимое stdin). По этой причине функция была объявлена устаревшей в третьем исправлении стандарта C99 и полностью удалена в стандарте C11. Рекомендуется использовать fgets() и gets_s().

ПРЕДУПРЕЖДЕНИЕ: никогда не используйте gets().

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
    • K.3.5.4.1 Функция gets_s (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • K.3.5.4.1 Функция gets_s (стр.: TBD)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • K.3.5.4.1 Функция gets_s (стр.: 602–603)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.19.7.7 Функция gets (стр.: 298)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
    • 4.9.7.7 Функция gets

См. также

scanffscanfsscanfscanf_sfscanf_ssscanf_s
(C11)(C11)(C11)
считывают форматированный ввод из stdin, файлового потока или буфера
(функция)
fgets
считывает символьную строку из файлового потока
(функция)
fputs
записывает символьную строку в файловый поток
(функция)
getlinegetwlinegetdelimgetwdelim
(технический отчёт по динамической памяти)
считывают данные из потока в автоматически увеличиваемый буфер до разделителя или конца строки
(функция)
Документация по C++ для gets

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

Spec-Zone.ru

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