Мне кажется, люди, особенно при изучении языка программирования C, все еще используют функцию gets
для чтения в данных из stdin. Несмотря на то что он теперь был удален от стандарта C11, и отказ от ответственности на cppreference гласит:Получилось ли когда-нибудь полезно?
получает (функция) не выполняет проверку границ, поэтому эта функция чрезвычайно уязвима для переполнения буфера атаки. Нельзя использовать (если программа не работает в среде, которая ограничивает то, что может появиться на stdin). По этой причине функция устарела в третьем исправлении к стандарту C99 и полностью удалена в стандарте C11. fgets() и gets_s() - рекомендуемые замены .
Никогда не используйте gets().
Однако, похоже, что это не новая проблема, которая придумала более современные философии программирования. Это всегда было бы сломано и вызвало бы крах программ, и я не понимаю, что может означать «среда, которая ограничивает то, что может появиться на stdin».
Значит, было Полезно в прошлом? Или в чем причина, по которой она была добавлена к предыдущим стандартам и пред-стандартным версиям C?
(1) ... или, по крайней мере, изменилось, чтобы иметь дополнительный параметр, указывающий максимальную длину для чтения. Однако я прошу про старую подпись, получая только указатель.
Из [FAQ] (http://stackoverflow.com/faq) * «Вы должны задавать только практические, ответные вопросы ** на основе реальных проблем, с которыми вы сталкиваетесь ** ...» * (мой акцент). –
???? http://stackoverflow.com/questions/3302255/c-scanf-vs-gets-vs-fgets –
@TJCrowder - в нем также говорится «проблемы, которые уникальны для профессии программирования», вы не будете спрашивать об использовании API вне профессии программирования – Mike