【发布时间】: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