Подтвердить что ты не робот

Почему fgets принимает int вместо size_t?

Функции, такие как strcpy(), malloc(), strlen() и другие другие принимают свои аргументы или возвращают значения как size_t вместо int или unsigned int по понятным причинам.

Некоторые функции файлов, такие как fread() и fwrite(), также используют size_t. По расширению, было бы ожидать, что char* fgets (char *str, int num, FILE *stream) должен использовать аргумент size_t, а не int как аргумент для его размера буфера.

Однако fgets() использует int. Есть ли объективное объяснение, почему?

4b9b3361

Ответ 1

Исходный K & R определил fgets() на стр .155 с аргументом int. Код, представленный в книге, сработал бы с unsigned int (он использует >0, но цикл написан так, чтобы он никогда не опускался ниже нуля).

size_t появился позже, в C89 (ANSI C), как тип sizeof(). Поскольку эта функция была специально введена для согласования распределения памяти, памяти функции управления и строковые функции были соответствующим образом обновлены. Но файловый ввод-вывод не был: единственными файловыми функциями, которые использовали size_t в C89, являются те новые введенный C89 и не существовавший в K & R, такой как, например, fread()/fwrite(). Да, у K & R не было этих функций и полагался на операции блока только на (не переносимые) unix функции чтения/записи с использованием дескрипторов файлов.

Следует отметить, что стандарт POSIX, который гармонизировал функции unix, был разработан параллельно с стандарт ANSI C и выпущенный в конце 1988 года. Этот стандарт гармонизировал многие функции unix, чтобы использовать size_t, чтобы read()/write() в настоящее время определяются с помощью size_t. Но для стандартных функций библиотеки C, таких как fgets(), POSIX дает преимущество стандарту C (формулировка текущей версии стандарта):

Функциональность, описанная на этой справочной странице, соответствует стандарту ISO C. Любой конфликт между описанными здесь требованиями и стандартом ISO C является непреднамеренным.

Таким образом, в POSIX, по иронии судьбы, fgets() все еще унаследован от своего исторического K & R int.


Изменить: дополнительное чтение

stdio.h: Этот заголовок определяет и прототипы большинства функций, перечисленных в главе 7 K & R. Немногие, если таковые имеются, были внесены изменения в определения, найденные в K & R, но добавлено несколько новых функций.