Самая последняя версия стандарта C (2011) окончательно удалил эту функцию из ее спецификации
Функция устарела в С++ (по состоянию на 2011 год, что следует С99 + ТС3).
Я просто хотел узнать, что является альтернативой gets()
в стандарте C11?
Самая последняя версия стандарта C (2011) окончательно удалил эту функцию из ее спецификации
Функция устарела в С++ (по состоянию на 2011 год, что следует С99 + ТС3).
Я просто хотел узнать, что является альтернативой gets()
в стандарте C11?
В 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
вы всегда читаете целую строку, даже если только часть ее может быть возвращена во входном буфере.
Другие уже ответили на вопрос. Для полноты, это стандартная рекомендация 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 принимают неопределенные значения.
Вы можете использовать fgets
или gets_s
:
http://www.java2s.com/Code/C/Console/Usefgetstoreadstringfromstandardinput.htm
Согласно man 3 gets
, fgets
.