循环固定大小的数组而不在C中定义其大小

时间:2009-12-28 13:57:31

标签: c loops

启动问题的一些示例代码:

 #define FOO_COUNT 5

 static const char *foo[] = {
       "123",
       "456",
       "789",
       "987",
       "654"
 };

通常迭代的方式,如下例所示:

int i = FOO_COUNT;
while (--i >= 0) {
 printf("%s\n", foo[i]);

无论如何,如果没有明确地将人数统计为5,是否仍然可以执行上述操作?将来我可能会添加/删除元素而忘记更新数组的大小,从而破坏我的应用程序。

8 个答案:

答案 0 :(得分:16)

int i = sizeof(foo)/sizeof(foo[0]);

答案 1 :(得分:12)

最后使用一个标记,例如NULL:

static const char *foo[] = {
       "123",
       "456",
       "789",
       "987",
       "654",
       NULL
};

for (char *it = foo[0]; it != NULL; it++)
{
        ...
}

答案 2 :(得分:2)

执行此操作的常用方法是使用NULL结束数组并迭代直到达到该值。

答案 3 :(得分:2)

int i = sizeof(foo) / sizeof(char*);

注意:这仅适用于静态分配的数组。它不适用于malloc ed或new ed数组。

答案 4 :(得分:2)

size_t i = sizeof foo / sizeof *foo; // or sizeof foo / sizeof foo[0]

这将foo数组中的总字节数(sizeof foo)除以单个元素(sizeof *foo)中的字节数,给出数组中的元素数。

答案 5 :(得分:2)

C99中还有另一种方法,特别是如果你想要命名索引,允许实例化本地化等。

enum STRINGS {
  STR_THING1,
  STR_THING2,
  STR_THING3,
  STR_THING4,
  STR_WHATEVER,

  STR_MAX         /* Always put this one at the end, as the counting starts at 0 */
                  /* this one will be defined as the number of elements */
}     

static const char *foo[STR_MAX] = {
  [STR_THING1]   = "123", 
  [STR_THING2]   = "456",
  [STR_THING3]   = "789",
  [STR_THING4]   = "987",
  [STR_WHATEVER] = "OR Something else",
};

通过使用命名的初始化程序,即使枚举值发生变化,程序仍然是正确的。

for (i = STR_THING1; i<STR_MAX; i++)
  puts(foo[i]);

或具有指定索引的程序中的任何位置

  printf("thing2 is %s\n", foo[STR_THING3]);

此技术可用于模拟资源包。使用语言变体声明一个enum和几个字符串数组,并在程序的其余部分使用指针。简单快速(特别是在64位机器上,获取常量(字符串)的地址可能相对昂贵。 编辑:sizeof foo / sizeof * foo技术仍适用于此。

答案 6 :(得分:0)

的sizeof(富)/的sizeof(字符*)

是5。

答案 7 :(得分:0)

对于某些应用,尝试 Catch 会有效。