Почему функция fgets устарела?
С учебник по программированию GNU C:
на
fgets("file get string") функция аналогична функции gets функция. Эта функция устаревший -- это означает, что он устарел и настоятельно рекомендуется не использовать его, потому что это опасный. Это опасно, потому что если входные данные содержат значение null характер, ты не можешь сказать. Не используйтеfgetsЕсли вы не знаете данных не может содержать значение null. Не используйте его чтение файлов, отредактированных пользователем потому что, если пользователь вводит символ null, вы должны либо обработайте его правильно или распечатайте четкое сообщение об ошибке. Всегда использоватьgetlineилиgetdelimвместоfgetsЕсли вы можете.
я думал fgets функция останавливается, когда она встречает  или n; почему эта страница руководства предполагает, что нулевой байт "опасен", когда fgets должен правильно обрабатывать вход? Кроме того, в чем разница между getline и fgets и  поистине устаревший на C99 или будущие стандарты C?
2 ответов
нет, fgets фактически не устарел в C99 или текущем стандарте, C11. Но автор этого учебника прав, что fgets не остановится, когда встретит нуль, и не имеет механизма для сообщения о его чтении такого символа.
на
fgetsфункция считывает не более одного меньше, чем количество символов, указанныхnот ручья, на который указалstreamв массив, на который указываетs. Никакие дополнительные символы не читаются после символ новой строки (который сохраняется) или после окончания файла.
(§7.21.7.2)
GNU-это getdelim и getline были стандартизированы в POSIX 2008, так что если вы нацелены на платформу POSIX, то это может быть не плохая идея использовать их вместо этого.
редактировать я думал, что нет абсолютно безопасного способа использовать fgets перед лицом символов NUL, но R.. (см. комментарии) указано там есть:
char buf[256];
memset(buf, '\n', sizeof(buf));  // fgets will never write a newline
fgets(buf, sizeof(buf), fp);
Теперь ищите последний не -\n персонаж buf. Хотя я бы не рекомендовал этого клуджа.
Это просто пропаганда GNU. Ни в каком официальном смысле это fgets устаревшие. gets однако опасно и устарело.
