【问题标题】:Length of array (C)数组长度 (C)
【发布时间】:2014-07-20 08:01:12
【问题描述】:

我有一个包含 10 个元素的数组。该数组存储了一些信息,但最后的信息以符号“END”(即-1)结束。

例如:

array[0] = 1;
array[1] = 1;
array[2] = 1;
array[3] = 1;
array[4] = 1;
array[5] = 1;
array[6] = END;

所以在这种情况下,长度是 7 而不是 10。

这是我的算法:

for (i = 0; (i < 10) 
             && (array[i] != END); i++)
 {
  ;
 }

最后 i 包含长度。

是正确的还是有其他方法?

【问题讨论】:

  • 像这样硬编码10不是一个好主意。
  • 数组元素的数量(例如arr)由sizeof arr / sizeof *arr给出。如果将数组传递给函数,则在函数内部它不再是数组(它是指向数组第一个元素的指针)并且表达式不再表示元素的数量。

标签: c arrays


【解决方案1】:

毫无疑问,还有 [至少不计其数] 其他方法,但这个看起来不错。不过,代码风格暗示了将神奇的“10”作为命名常量。

【讨论】:

    【解决方案2】:

    (i &lt; 10) &amp;&amp; (array[i] != END);非常脆弱。请记住,访问数组边界之外的数组元素是未定义的行为

    如果您知道数组的结尾是总是END,那么您可以完全删除(i &lt; 10)

    最好将数组它的长度传递给任何使用该数组的函数。

    【讨论】:

    • 对于第一句话,索引i受第一个条件(i
    • 它永远不会发生现在。当一位同事开始编写您的代码库,而您的资历太高而无法涉足到那时对您来说将是微不足道的事情时,情况可能会有所不同!
    【解决方案3】:

    我的“DRY”观点是数组的长度应该暗示其中有多少数据元素。考虑预先调整数组的大小以匹配元素的数量,或者使用其他数据类型,如 ArrayList or a List,允许调整大小。

    编辑:看起来你在 C 中(我误读了)。调整大小可以是hairier

    【讨论】:

      【解决方案4】:

      您应该创建一个结构来表示您的集合。

      struct MyCollection {
          int *items;
          int count;
      };
      
      MyCollection* MyCollection_Create(int capacity) {
         MyCollection *ret = malloc(sizeof(MyCollection));
         ret->items = calloc(sizeof(int) * capacity);
         ret->count = 0;
         return ret;
      }
      
      MyCollection_Destroy(MyCollection *col) {
        free(col->items);
        free(col);
      }
      
      MyCollection_AddItem(MyCollection *col, int item) {
        col->items[col->count++] = item;
      }
      
      int MyCollection_GetCount(MyCollection *col) {
         return col->count;
      }
      

      【讨论】:

        【解决方案5】:

        C 字符串是以 '\0' 结尾的 char 数组。

        问题代码做了一个非常相似的事情,只是以 (-1) 而不是 (0) 结尾。

        问题算法和C的strlen()没有太大区别;它计算数组/字符串中元素的数量,直到遇到 '\0' 终止符。

        鉴于 C 字符串的成功,该算法是合理的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-29
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-18
          • 2011-02-20
          • 2014-06-17
          相关资源
          最近更新 更多