C-可以fgets接受NULL参数吗?

时间:2014-12-17 01:26:18

标签: c parameter-passing fgets

我意识到C语言中有一些函数具有可选参数,这意味着用户可以将NULL作为参数值传递。我很好奇是否可以使用fgets()。

假设我想将整行作为字符串保存在文件中,换句话说,我希望fgets()在到达换行符时停止(\ n),那么我可以执行以下操作吗?

fgets(string, NULL, file);  //where string is simply an array of char

我认为这是可能的,因为fgets()总是在到达换行符时停止,但如果不可能,当一个人不知道行长时,将整行保存为字符串的正确程序是什么? ?

3 个答案:

答案 0 :(得分:3)

NULL作为尺寸参数传递给fgets基本上会传入0。 NULL通常定义为

#define NULL 0

但它应该用作指针,而不是int。

我怀疑传递大小为0时fgets()的行为是未定义的,或者是无操作。

文档(在linux上)陈述

fgets() reads in at most one less than size characters from  stream  and  stores  them
into  the  buffer pointed  to  by s.  Reading stops after an EOF or a newline.  If a
newline is read, it is stored into the buffer.  A terminating null byte ('\0') is stored
after the last character in the buffer.

如何读取-1个字符?它会在哪里存储尾随NUL

这就是我倾向于未定义的行为的原因。

当你不知道它们可能有多长时间阅读字符串时,有两个部分要处理:

  • 首先,使静态缓冲区大于预期的最长行,以尽量减少失败的可能性。
  • 处理fgets返回一个完整的缓冲区(其中s[size-2] != '\n'),方法是通过realloc生成一个动态分配的缓冲区,并用来连接fgets的连续返回值直到看到新的一行。

答案 1 :(得分:3)

C实际上没有可选参数 虽然有些函数为某些参数定义了特殊值(最常见的是指针参数的空指针),这意味着"做默认值"。

可以<{3}}使用fgets作为特定文件,传递INT_MAX,从而有效地删除限制。
在考虑这样做之前,请考虑为什么 C禁止gets来自标准库。

另外,NULL是一个实现定义的空指针常量,这可能意味着它不能隐式转换为int

答案 2 :(得分:3)

请改用getline功能。这是手册页中的示例代码

       char *line = NULL;
       size_t linecap = 0;
       ssize_t linelen;
       while ((linelen = getline(&line, &linecap, fp)) > 0)
               fwrite(line, linelen, 1, stdout);

请注意,如果缓冲区不够大,getline会自动realloc缓冲区,当您不再需要时,free缓冲区是您的责任。