为什么 fgets 接受 int 而不是 size_t?

Why does fgets accept an int instead of a size_t?

strcpy()malloc()strlen() 等函数和其他各种函数接受它们的参数或 return 值作为 size_t 而不是 intunsigned int 原因显而易见。

fread()fwrite() 等一些文件函数也使用 size_t。通过扩展,预计 char* fgets (char *str, int num, FILE *stream) 应该使用 size_t 而不是 int 作为其缓冲区大小的参数。

但是,fgets() 使用 int。有什么objective解释为什么吗?

最初的 K&R 在第 155 页用 int 参数定义了 fgets()。书中提供的代码本来可以工作 也有一个 unsigned int(它使用一个 >0,但是循环被写成永远不会低于零)。

size_t 后来在 C89 (ANSI C) 中作为 sizeof() 的类型引入。由于此功能是专门为协调内存分配而引入的,内存 管理功能和字符串功能已相应更新。但是文件 I/O 不是:在 C89 中使用 size_t 的唯一文件函数是那些新函数 由 C89 引入,在 K&R 中不存在,例如 fread()/fwrite()。是的,K&R 没有这些功能 并且仅依赖于使用文件描述符的(不可移植的)unix read/write 函数的 bloc 操作。

需要注意的是POSIX standard,统一了unix的功能,是并行开发的 ANSI C 标准和 issued late 1988。该标准协调了许多 unix 函数以使用 size_t 以便如今 read()/write()size_t 定义。但是对于C标准库函数如fgets(),POSIX优先于C标准 (当前版本标准的措辞):

The functionality described on this reference page is aligned with the ISO C standard. Any conflict between the requirements described here and the ISO C standard is unintentional.

所以在 POSIX 中,具有讽刺意味的是,fgets() 仍然继承了其历史 K&R int


编辑:补充阅读

stdio.h: This header defines and prototypes most of the functions listed in Chapter 7 of K&R. Few, if any, changes were made in the definitions found in K&R but several new functions have been added.