В начале 90-х или около того, было обнаружено, что gets()
ошибочен дизайном, так как он будет продолжать считывать данные навсегда, пока не найдет конец строки, что означает, что это может привести к переполнению буфера либо случайно, либо посредством эксплойтов безопасности.
Поэтому gets
был отмечен как устаревшая функция в стандарте C99. Это означает, что с 1999 года люди были предупреждены о том, что его не следует использовать.
Функция полностью удалена из языка стандарта C11, что означает, что для исправления устаревшего кода был очень щедрый период перехода не менее 12 лет. Он был заменен на gets_s
, что является безопасной альтернативой для переноса старого кода на C11. В качестве второго параметра требуется размер буфера.
Однако gets_s
следует использовать только для таких причин портирования C11, если вообще существует. gets_s
является частью дополнительного интерфейса проверки границ в C11, и компиляторы не должны его реализовывать. Стандарт C11 рекомендует использовать fgets
вместо:
Recommended practice
The fgets function allows properly-written programs to safely process input lines too long to store in the result array. In general this requires that callers of fgets pay attention to the presence or absence of a new-line character in the result array. Consider using fgets (along with any needed processing based on new-line characters) instead of gets_s.
Обратите внимание, что gets_s
имеет мало общего с нестандартным Visual Studio компилятор, несмотря на то, что компилятор случается поддерживает эту функцию, так же, как стандартный СООТВЕТСТВИЕ компиляторы, которые поддерживают интерфейс проверки границ (__STDC_LIB_EXT1__
).
«Не должно работать со всеми компиляторами». Нет, это не стандартная функция С. Это специфичная Microsoft, поэтому в основном нужна Visual Studio. – kaylum
@kaylum, отличается ли «ANSI C» от стандартного «Microsoft»? – BumbleBee
@kaylum, это нормально, чтобы не узнать об этих стандартах? Как получить дополнительную информацию о типичном количестве доступных стандартов? – BumbleBee