获取未知长度的字符串数组的长度

时间:2010-09-24 01:13:16

标签: c pointers arrays

我有这个功能:

int setIncludes(char *includes[]);

我不知道includes将采用多少个值。它可能需要includes[5],可能需要includes[500]。那么我可以使用什么函数来获得includes的长度?

6 个答案:

答案 0 :(得分:16)

没有。那是因为当传递给函数时,数组会衰减到指向第一个元素的指针。

您必须自己传递长度或使用数组中的某些内容来指示大小。


首先,“传递长度”选项。用以下内容调用您的函数:

int setIncludes (char *includes[], size_t count) {
    // Length is count.
}
:
char *arr[] = {"Hello,", "my", "name", "is", "Pax."};
setIncludes (arr, sizeof (arr) / sizeof (*arr));
setIncludes (arr, 2); // if you don't want to process them all.

sentinel方法在末尾使用一个特殊值来表示没有更多元素(类似于C \0数组末尾的char来表示字符串)并且会是这样的:

int setIncludes (char *includes[]) {
    size_t count = 0;
    while (includes[count] != NULL) count++;
    // Length is count.
}
:
char *arr[] = {"Hello,", "my", "name", "is", "Pax.", NULL};
setIncludes (arr);

我见过的另一种方法(主要用于整数数组)是使用第一项作为长度(类似于Rexx词干变量):

int setIncludes (int includes[]) {
    // Length is includes[0].
    // Only process includes[1] thru includes[includes[0]-1].
}
:
int arr[] = {4,11,22,33,44};
setIncludes (arr);

答案 1 :(得分:2)

您有两种选择:

  1. 您可以添加第二个参数,类似于:

    int main(int argc, char**argv)

  2. ...或者您可以双重终止列表:

    char* items[] = { "one", "two", "three", NULL }

答案 2 :(得分:1)

在C中无法简单地确定任意数组的大小。它需要以标准方式提供的运行时信息。

支持此功能的最佳方法是将函数中数组的长度作为另一个参数。

答案 3 :(得分:0)

你必须知道大小。一种方法是将大小作为第二个参数传递。另一种方法是同意调用者他/她应该包含一个空指针作为传递的指针数组中的最后一个元素。

答案 4 :(得分:0)

虽然它是一个非常老的线程,但事实上你可以使用Glib确定C中任意字符串数组的长度。请参阅以下文档:

https://developer.gnome.org/glib/2.34/glib-String-Utility-Functions.html#g-strv-length

提供的,它必须是以null结尾的字符串数组。

答案 5 :(得分:-2)

那么strlen()函数呢?

  char *text= "Hello Word";
  int n= strlen(text);
OR
  int n= (int)strlen(text);