gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:44:47 25 4
gpt4 key购买 nike

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

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

然而,fgets()使用 int。有什么客观的解释为什么?

最佳答案

最初的 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 读/写函数的 bloc 操作。

需要注意的是 POSIX standard , 它协调了 unix 的功能,是与ANSI C 标准和 issued late 1988 .该标准协调了许多 unix 函数以使用 size_t 以便 read()/write() 现在用 size_t 定义。但对于fgets()等C标准库函数,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.

关于c - 为什么 fgets 接受 int 而不是 size_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38719737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com