Функция gets
была сначала устарела на C99 и, наконец, удалена в C11. Однако в C-библиотеке нет прямой замены.
fgets()
не является замещающей заменой, поскольку он не разделяет окончательный '\n'
, который может отсутствовать в конце файла. Многие программисты тоже ошибаются.
Существует один слой для удаления строки: buf[strcspn(buf, "\n")] = '\0';
, но это нетривиально и часто вызывает объяснение. Это может быть и неэффективным.
Это контрпродуктивно. Многие новички по-прежнему используют gets()
, потому что их учителя хромают или их устаревшие устаревшие.
Microsoft предложила gets_s()
и многие связанные с ней функции, но она не обрезает лишние строки молчанием, поведение в этом нарушении ограничений не совсем просто.
Как BSD, так и GNU libc имеют getline
, стандартизованный в POSIX, который выделяет или перераспределяет буфер через realloc
...
Каков наилучший способ научить новичков об этом беспорядке?