Подтвердить что ты не робот

Что получает() эквивалент в C11?

От cplusplus.com

Самая последняя версия стандарта C (2011) окончательно удалил эту функцию из ее спецификации

Функция устарела в С++ (по состоянию на 2011 год, что следует С99 + ТС3).

Я просто хотел узнать, что является альтернативой gets() в стандарте C11?

4b9b3361

Ответ 1

В C11 gets был заменен на gets_s, который имеет следующее объявление:

char *gets_s(char *str, rsize_t n);

Эта функция будет читать не более n-1 символов из stdin в *str. Это делается для того, чтобы избежать уязвимости переполнения буфера, присущей gets. Функция fgets также является опцией. Из http://en.cppreference.com/w/c/io/gets:

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

Никогда не используйте gets().

Учитывая, что gets_s определяется в расширении стандарта, только опционально реализованный, вы, вероятно, должны писать свои программы, используя fgets. Если вы используете fgets на stdin, ваша программа также будет компилироваться в более ранних версиях C. Но имейте в виду разницу в поведении: когда gets_s прочитал n-1 символы , он продолжает читать до тех пор, пока новый line или end-of-file, отбрасывая вход. Таким образом, при gets_s вы всегда читаете целую строку, даже если только часть ее может быть возвращена во входном буфере.

Ответ 2

Другие уже ответили на вопрос. Для полноты, это стандартная рекомендация C:

ISO9899: 2011 K.3.5.4.1/6

Рекомендуемая практика

Функция fgets позволяет правильно написанным программам безопасно обрабатывать строки ввода слишком долго для сохранения в результате массив. В целом это требует, чтобы вызывающие лица наличие или отсутствие символа новой строки в массиве результатов. Рассмотрите возможность использования fgets (наряду с любой необходимой обработкой на основе new-line characters) вместо gets_s.

Поэтому вы должны использовать fgets, когда это возможно.

ИЗМЕНИТЬ

Поведение

gets_s указано как:

ISO9899: 2011 K.3.5.4.1/4

Описание

Функция gets_s читает не более одного числа, чем число символов, заданных n из потока, на который указывает stdin, в массив, на который указывает s. Нет дополнительных символы считываются после символа новой строки (который отбрасывается) или после окончания файла. Отброшенный символ новой строки не учитывается в количестве прочитанных символов. нулевой символ записывается сразу после последнего символа, считываемого в массив.

Если встречается конец файла, и никакие символы не считываются в массив, или если чтение ошибка возникает во время операции, тогда s [0] устанавливается на нулевой символ, а другой элементы s принимают неопределенные значения.

Ответ 4

Согласно man 3 gets, fgets.