Получить длину строкового массива неизвестной длины - PullRequest
9 голосов
/ 24 сентября 2010

У меня есть эта функция:

int setIncludes(char *includes[]);

Я не знаю, сколько значений примет includes.Это может занять includes[5], это может занять includes[500].Так какую функцию я могу использовать, чтобы получить длину includes?

Ответы [ 6 ]

16 голосов
/ 24 сентября 2010

Там нет ни одного. Это связано с тем, что массивы будут переходить в указатель на первый элемент при переходе к функции.

Вы должны либо сами передать длину, либо использовать что-то в самом массиве для указания размера.


Во-первых, опция «передать длину». Вызовите свою функцию с чем-то вроде:

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.

Метод стража использует специальное значение в конце, чтобы указать, что больше нет элементов (аналогично \0 в конце массива C 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);
2 голосов
/ 24 сентября 2010

У вас есть две опции:

  1. Вы можете включить второй параметр, аналогичный:

    int main(int argc, char**argv)

  2. ... или вы можете завершить список двойным нулем:

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

1 голос
/ 24 сентября 2010

Нет способа просто определить размер произвольного массива, подобного этому, в C. Для этого требуется информация времени выполнения, которая не предоставляется стандартным способом.

Лучший способ поддержать это - взять длину массива в функции в качестве другого параметра.

0 голосов
/ 25 июля 2013

А как насчет функции strlen ()?

  char *text= "Hello Word";
  int n= strlen(text);
OR
  int n= (int)strlen(text);
0 голосов
/ 11 июля 2013

Хотя это очень старый поток, но на самом деле вы можете определить длину произвольного массива строк в C, используя Glib. См. Документацию ниже:

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

При условии, это должен быть массив строк с нулевым символом в конце.

0 голосов
/ 24 сентября 2010

Вы должны знать размер в любом случае. Один из способов - передать размер в качестве второго параметра. Другой способ - договориться с вызывающим абонентом, что он / она должен включать нулевой указатель в качестве последнего элемента в переданном массиве указателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...