【问题标题】:What size should be used for fgets?fgets 应该使用什么尺寸?
【发布时间】:2017-02-23 00:01:20
【问题描述】:

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

char input[LINE_SIZE + 1]; /* +1 for '\0'. */

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

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

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

【问题讨论】:

  • 不需要加/减 1。当input 是一个数组时,建议fgets(input, sizeof input, stdin)
  • 为什么要传递一个你知道减1的值?话虽如此,它在安全方向上偏离了 1,因此几乎没有实际风险。
  • 对于char input[LINE_SIZE + 1];LINE_SIZE是最大字符数(不包括终止符),LINE_SIZE + 1是数组的实际大小。对于fgets(),您传递数组的大小......它最多会少读一个字符,并添加终止符。
  • @JohnColeman 你刚刚说了确切的原因......在安全方向上将其关闭 1 可确保如果您不小心在不安全方向上关闭 1,它们只会取消。例如,某些函数的长度不包括字符串终止符。
  • 德米特里的想法是正确的。值得一提的是,我打算在我的数组input 中不浪费空间。我的fgets 方法将最多将LINE_SIZE 非NULL 字符放入input,还是将LINE_SIZE 字符包括 NULL 终止符?

标签: c string styles fgets code-readability


【解决方案1】:
7.21.7.2 fgets 函数

剧情简介

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

说明

2     fgets 函数读取最多比n 指定的字符数少一个stream 指向的流到s 指向的数组。没有额外的 在换行符(保留)之后或文件结尾之后读取字符。一种 在读入数组的最后一个字符之后立即写入空字符。

C 2011 Online Draft

已添加重点。

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

【讨论】:

  • 这很好地解释了这个问题。谢谢你。我将不得不将所有出现的fgets 使用LINE_SIZE 更改为LINE_SIZE + 1
【解决方案2】:

我无法评论(

如果你使用

char input[LINE_SIZE ];

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

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

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

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

读取 8 (LP64) 个字符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多