Объявление gets
:
char * gets ( char * str );
Обратите внимание на вопиющее упущение максимального размера для str.
cplusplus.com говорит 2
Обратите внимание, что получение отличается от fgets: не только использует stdin как источник, но он не включает символ окончания строки в полученной строке и не позволяет указать максимальный размер для str (, что может привести к переполнению буфера).
А также:
Самая последняя версия стандарта C (2011) окончательно удалил эту функцию из ее спецификации. Функция устаревший в С++ (по состоянию на 2011 год, который следует за C99 + TC3).
Теперь, конечно, fgets
обычно рекомендуется в качестве замены gets
, потому что его объявление выглядит следующим образом:
char * fgets ( char * str, int num, FILE * stream );
Он ДАЕТ принять параметр размера. Это делает его намного безопаснее, чем gets
.
Теперь, поскольку я не хочу тратить деньги на скачивание или покупку C11 standard
, может ли кто-нибудь пролить свет на причину обесценивания gets
и что это значит для будущего кода? Почему он существует в том же месте, когда fgets
безопаснее? И почему он только сейчас устарел?