枚举C中的数组,同时输出数组的编号

时间:2017-03-28 13:51:01

标签: c arrays enumerate

我正在尝试在C中枚举一个数组(就像在python中你可以使用#enumerate函数一样)。

static enumerate(const char *data[])
{
    int i;
    int stopLength = sizeof(data);
    for(i=0; i < stopLength; i++)
    {
        printf("[%d] %s", i+1, data[i]);
    }
}

int main(int argc, char *argv[])
{
    char *friends[] = {"test", "test", "test"};
    enumerate(friends);
}

但是当我尝试使用此功能时,我收到以下错误:

utilis.c: In function ‘int enumerate(char**)’:
utilis.c:58:33: warning: ‘sizeof’ on array function parameter ‘data’ will return size of ‘char**’ [-Wsizeof-array-argument]
     int stopLength = sizeof(data);
                                 ^
utilis.c:55:29: note: declared here
 static enumerate(char *data[])
                             ^
utilis.c: In function ‘int main(int, char**)’:
utilis.c:78:46: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
     char *friends[] = {"test", "test", "Test"};
                                              ^
utilis.c:78:46: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
utilis.c:78:46: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

我理解错误告诉我的内容,但我不明白如何实现我想要做的事情。在python我可以这样做:

friends = ["test", "test", "test"]
for i, f in enumerate(friends, start=1):
    print "[{}] {}".format(i, f)

# [1] test
# [2] test
# [3] test

如何让我的C函数按我的意愿运行?

2 个答案:

答案 0 :(得分:1)

问题是数组在传递给函数时会衰减为指针。在enumerate函数中,data实际上是char **类型的指针,即使您已将其声明为数组 - char *[]。没有办法直接将整个数组传递给函数。必须另外传递大小作为参数,或者包含在结构中,例如。

C数组在运行时不知道它们的大小。只有在声明静态大小的数组(不是指针)时,才能通过sizeof(arr) / sizeof(*arr)表达式获取其大小(在编译时计算) :

int arr[42];
/* the result will be equal to `sizeof(int) * 42` */
printf("arr size: %zu\n", sizeof(arr) / sizeof(*arr));

分子是数组的总大小(以字节为单位),分母是每个元素的大小,给出了数组的编译时大小(在运行时不能动态更改)。

答案 1 :(得分:1)

由于它是一个函数参数,因此数组会调整为指向第一个元素的指针。在您的情况下,指向数组中的第一个指针。你不能使用enumerate(sizeof(array)/sizeof(*array), array); ,因为这只会产生一个指针的大小,这并不是很有用。相反,您需要将数组的大小传递给函数:

[
    {"PieChart", Piechartdata, 0,1},
    {"donut", donutdata, 1,0},
    {"grid", griddata, 1,1}
] 

呼叫者:

*ngFor