You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:33:19