Почему функция 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 однако опасно и устарело.