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.
添加了重点。
如果您指定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
我的一个程序中有以下代码段:
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 Thefgets
function
Synopsis
1#include <stdio.h>
char *fgets(char * restrict s, int n, FILE * restrict stream);
Description
2 Thefgets
function reads at most one less than the number of characters specified byn
from the stream pointed to bystream
into the array pointed to bys
. 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.
添加了重点。
如果您指定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