Почему gets() устарел?

При использовании gets() в моем коде компилятор кричит

warning: the 'gets' function is dangerous and should not be used.`

и

warning: ‘gets’ is deprecated (declared at /usr/include/stdio.h:638)
[-Wdeprecated-declarations]

Любые конкретные причины?

Ответ 1

Может кто-то объясняет, почему компилятор показывает это...?

Да, потому что функция gets() опасна, так как она страдает от проблемы переполнения буфера. Любой человек должен воздержаться от использования этого.

Кроме того, что касается предупреждения с помощью -Wdeprecated-declarations, gets() больше не является частью стандарта C [C11 и далее]. Таким образом, C-библиотеки компиляторы не обязаны это поддерживать. Его можно удалить в будущем. Чтобы предупредить разработчика о потенциальной ловушке и препятствовать дальнейшему использованию gets(), компилятор ## выдает предупреждающее сообщение.


(##) Чтобы быть педантичным, предупреждение не генерируется компилятором (gcc) само по себе, а вызвано pragma или атрибутом реализации gets() в glibc, который заставляет компилятор выпустить предупреждение. [Предоставлено, FUZxxl, из ответа об ошибке.]

Ответ 2

  • gets может вызвать переполнение буфера, поскольку он не учитывает длину данных. Подробнее здесь: функция gets() в C

  • устаревшее средство сообщения, эта функция помечена как устаревшая и может быть удалена со стандартного в более позднее время. Так что обескураживать пользователя использовать его.