我一直在比较两个语句,它们使用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循环中),需要第二种确定数组大小的方法。
第二个声明看起来很难看,但使用它还有其他任何主要缺点吗?以下是我能想到的一些优点:
答案 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_NUMBER
。 fgets
将填充array
的第一个元素,然后溢出到一个或多个后续元素中。在这里,你真的想传入SOME_OTHER_NUMBER
。
这里的要点是你需要明确传递给fgets
的值。对于正常情况(单维char
数组),sizeof(array)
很好。对于char
数组的数组(如上所示),应使用SOME_OTHER_NUMBER
或sizeof(array[0])
。
永远不应使用sizeof(array)/sizeof(array[0])
方法,因为不计算与sizeof(char)
本身相关的大小。它正在计算array
中的元素数量 - 无论其大小如何。