fgets大小参数的最佳实现?

时间:2015-02-14 13:06:47

标签: c string sizeof fgets

我一直在比较两个语句,它们使用fgets从标准输入中读取字符串。

char array[10];
fgets(array, sizeof(array), stdin) ;
fgets(array, (sizeof(array)/sizeof(array[0])) , stdin);

从技术上讲,两者都是相同的,但方法2是多余的,因为fgets只能接受char数组。 我的思维过程是因为fgets采用char * s参数,所以不需要第二个例子(字符是一个字节,所以除以1是多余的)。

但是,在处理不同数据类型的数组时(例如在for循环中),需要第二种确定数组大小的方法。

第二个声明看起来很难看,但使用它还有其他任何主要缺点吗?以下是我能想到的一些优点:

  1. 教导确定其他应用程序的数组大小的正确方法,例如: for for()循环。
  2. 如果(不适用于此示例,因为fgets只接受char数组)数组类型已更改,则不会分解

1 个答案:

答案 0 :(得分:1)

如下所示,第二种形式可能会让您感到不愉快。

fgets(array, (sizeof(array)/sizeof(array[0])) , stdin);

具体来说,fgets的第二个参数表示char可以容纳的array值的最大值(尾随NUL减去1)。

所以,如果array被声明为

char array[SOME_NUMBER];

然后sizeof(array)/sizeof(array[0])会产生SOME_NUMBER。但如果它被定义为以下之一呢?

int array[SOME_NUMBER];
char array[SOME_NUMBER][SOME_OTHER_NUMBER];

在这两种情况下,它都会产生SOME_NUMBER,因为它会计算数组中元素的数量。但它完全忽略了每个元素的大小。想象一下,在第二种情况下,SOME_NUMBER明显大于SOME_OTHER_NUMBERfgets将填充array的第一个元素,然后溢出到一个或多个后续元素中。在这里,你真的想传入SOME_OTHER_NUMBER

这里的要点是你需要明确传递给fgets的值。对于正常情况(单维char数组),sizeof(array)很好。对于char数组的数组(如上所示),应使用SOME_OTHER_NUMBERsizeof(array[0])

永远不应使用sizeof(array)/sizeof(array[0])方法,因为计算与sizeof(char)本身相关的大小。它正在计算array中的元素数量 - 无论其大小如何。