fgets 应该使用什么大小?

What size should be used for fgets?

我的一个程序中有以下代码段:

char input[LINE_SIZE + 1]; /* +1 for '[=10=]'. */

while(fgets(input, LINE_SIZE, stdin) != NULL)
{
    /* Do stuff. */
}

在一个已被删除的问题中,有人向我指出我的代码可能存在错误。我用“+ 1”表示法声明字符串,以使代码更具信息性和可读性(确保我不会忘记考虑 NULL 终止符,因为这曾经是一个问题)。但是,有人告诉我 fgets 的第二个参数应该使用完全相同的大小。我在这里看到其他帖子和我做同样的做法。

我不确定。在 fgets 参数中不包含“+ 1”也是一种不好的做法吗?

7.21.7.2 The fgets function

Synopsis

1        #include <stdio.h>
         char *fgets(char * restrict s, int n, FILE * restrict stream);

Description

2     The fgets function reads at most one less than the number of characters specified by n from the stream pointed to by stream into the array pointed to by s. No additional characters are read after a new-line character (which is retained) or after end-of-file. A null character is written immediately after the last character read into the array.

C 2011 Online Draft

添加了重点。

如果您指定LINE_SIZE,那么fgets将最多读取LINE_SIZE - 1个字符到input,并将写入最后一个输入字符后的 0 终止符。请注意,如果有空间,fgets 将存储换行符。

我无法发表评论(<50 分)但是:

如果你使用

char input[LINE_SIZE ];

while(fgets(input, LINE_SIZE, stdin) != NULL)
{
    /* Do stuff. */
}

fgets() 不会超出您的输入 [] 缓冲区,但是如果您确实需要捕获 LINE_SIZE 个字符,您将在下一次调用中单独收到最后一个字符,这可能是您意想不到的.

另外:sizeof 关键字不会 return 运行 时间分配的完整大小,因此您必须跟踪动态分配的缓冲区并使用不同的方法:

char * input = malloc(50)    
fgets(input, sizeof input, stdin)

reads 8 (LP64) characters