为何fgets()的count参数采用有符号int类型而非size_t?
C23标准中
fgets函数规范及相关疑问 函数规范
7.23.7.2 fgets函数
摘要
#include <stdio.h> char *fgets(char * restrict s, int n, FILE * restrict stream);fgets函数从
stream指向的流中读取至多n-1个字符到s指向的数组中。读取到换行符(会被保留)或文件结束符后停止读取。读取完成后,会在最后一个字符后立即写入一个空字符。返回值
操作成功时,fgets返回s。若遇到文件结束符且未向数组写入任何字符,数组内容保持不变并返回空指针。若读取过程中发生错误,数组元素值未定义且返回空指针。
规范历史与参数类型疑问
该规范自最初的ANSI-C文档以来基本未变,仅在C99标准中为参数添加了restrict关键字。
值得注意的是,参数n的类型被指定为int,这与其他接收数组长度或对象计数、采用size_t类型的C库函数不一致。如果修改这个问题,可能会破坏那些使用指向fgets的函数指针,或是传递负数作为n的程序。
像fread和fwrite这类标准函数,最初在Unix文档中数值参数和返回值都是int,但在ANSI-C之前就已经修改为适配size_t的类型。这不禁让人疑问:为何fgets没被纳入那次更新?当时是否有充分理由对fgets区别对待?
未明确规定的行为场景
目前规范中还有部分场景的行为未被明确说明:
- 若
n <= 1,fgets是否应直接返回s而不尝试读取流? - 若
n == 1,即使未向数组读取任何字符,是否仍需将s[0]设为空字符? - 若
n <= 0,是否允许传递空指针作为s?
内容的提问来源于stack exchange,提问作者chqrlie
相关产品推荐
相关产品推荐

