7

我想实现以下函数来打印char通过指针数组引用的几个字符串的内容。如何确定有多少指针而不将总数作为函数的参数传递?

如果它是一个类型的数组,int那么可以使用该sizeof()函数,但鉴于我的数组的每个项目都是一个指向char字符串的指针,并且每个字符串的长度可能不同,我认为我不能使用这种方法。

void printCharArray(char *arr[]){

    int length = sizeof(arr) / sizeof(char); /* this does not give correct 
                                          number of items in the pointer array */

    for (int i=1;i<=length; i++) {
        printf("Array item: [%s]",arr[i]);
    }

}
4

5 回答 5

13

没有内置的方法可以做到这一点,因为 C 不会像这样跟踪数组中元素的数量。

你有几个选择:

  1. 传递数组中的项目数。
  2. 将最后一项设置为 NULL,以便代码知道何时到达末尾。(这就是 C 字符串的处理方式。)
  3. 否则修改您的数据结构以跟踪数组中的项目数。
于 2012-12-24T00:56:08.213 回答
6

您不能将数组作为 C 中的函数参数传递。当用作函数参数时,数组名称会衰减为指向其第一个元素的指针,并且您必须单独指定可用数组元素的数量。

(在函数参数类型的上下文中,T[]andT*T[12]是相同的,所以你的函数参数也可能是char ** arr。)

像这样:

void printCharArray(char ** arr, size_t len) { /* ... */ }

int main()
{
    char * arr[10] = { "Hello", "World", /* ... */ };

    printCharArray(arr, sizeof(arr)/sizeof(*arr));
}

(或者,您可以提供“第一个”和“一个过去的”指针,这可能更自然一些。)

于 2012-12-24T00:56:43.893 回答
2

如果您将最后一个有效元素之后的元素设置为 null ,那么您可以执行以下操作:

void printCharArray(char *arr[]){

    for (int i=0; arr[i] != NULL; i++) {
        printf("Array item: [%s]",arr[i]);
    }

}
于 2012-12-24T00:55:37.683 回答
0
void printCharArray(char *arr[]) {
    int length = sizeof(arr) / sizeof(char*); /* this does not give correct 
                                                 number of items in the pointer array */
    for (int i=0;i<=length; i++) {
        printf("Array item: [%s]",arr[i]);
    }
}

int main()
{
    char * arr[10] = { "Hello", "World", /* ... */ };
    printCharArray(arr); 
}
于 2012-12-24T04:25:18.637 回答
0

首先,我将 y 声明为全局变量。htmTags 是一个 *char[]。然后在 main()

y = 0;
while( htmTags[y] ) {
        y++;
}

我没有在数组末尾添加 null 。提供数组元素的实际计数

或者这也适用于 (y=0;htmTags[y];y++) ;

于 2015-10-15T02:53:18.170 回答