Я объявил массив из 30 элементов как: -

unsigned char some_array[30];

Я храню некоторые элементы в массиве, например: -

{0xFB, 0x07, 0x0B, 0x02, 0x00, 0x0C, 0x03, 0x08, 0x0F, 0x0F, 0x07, 0x0A, 0x09, 0x06, 0x0D}

Мне нужно найти количество элементов в этом массиве.

sizeof (some_array) / sizeof (some_array[0]); 

Дает 30 - общее количество элементов, которое может хранить массив.

strlen(some_array);

Дает 4, что является индексом элемента 0x00 в массиве.

Как я могу определить количество элементов, хранящихся в массиве ??

0
Sandrocottus 28 Апр 2016 в 07:53

6 ответов

Лучший ответ

Перед назначением фактических значений вы можете сделать memset для всего массива, который установит значение, которое, как вы уверены, не будет частью вашего инициализированного диапазона значений, например 0xff. Затем выполните цикл for и посчитайте.

int cnt = 0;
memset (some_array, 0xff, 30);

for (i = 0; i < 30; i++) {
    if (some_array[i] != 0xff) {
        cnt++;
    }
}

printf ("%d\n", cnt);
0
Sumit Trehan 28 Апр 2016 в 05:19

В C нет встроенной функции для поиска количества элементов, хранящихся в массиве, потому что все незаполненные поля в массиве будут иметь некоторое значение. Он может только найти общий размер массива.

Один из способов сделать это - заполнить весь массив предопределенным специальным символом перед загрузкой значений в массив (которые не включают специальный символ). Например;

unsigned char some_array[30];

memcpy(some_array, '\0', 30);

Then load some values to array;

strlen(some_array);

Здесь strlen(some_array); вернет количество символов в массиве

1
K.H.A.J.A.S 28 Апр 2016 в 05:39

Нет встроенной конструкции C, чтобы делать то, что вы просите.

Как вы сказали, C может сказать вам, насколько большим вы выделили массив. Однако он не имеет понятия о том, когда вы храните значимое значение в массиве. Когда вы объявляете массив, в нем 30 элементов (вероятно, с мусорной оценкой), и когда вы помещаете в него свои собственные значения, в нем все еще остается 30 элементов, некоторые из которых являются вашими значениями, а некоторые - мусором.

strlen() работает на strings, особый тип массива char в C, в котором хранится нулевой байт для обозначения конца строки.

2
skearney 28 Апр 2016 в 05:12

Определить макрос следующим образом:

#define INITIALIZE_LIST {0xFB, 0x07, 0x0B, 0x02, 0x00, 0x0C, 0x03, 0x08, 0x0F, 0x0F, 0x07, 0x0A, 0x09, 0x06, 0x0D}
#define INITIALIZE_LIST_SIZE sizeof((unsigned char[])INITIALIZE_LIST)

Пример кода для использования:

#include <stdio.h>

#define INITIALIZE_LIST {0xFB, 0x07, 0x0B, 0x02, 0x00, 0x0C, 0x03, 0x08, 0x0F, 0x0F, 0x07, 0x0A, 0x09, 0x06, 0x0D}
#define INITIALIZE_LIST_SIZE sizeof((unsigned char[])INITIALIZE_LIST)

int main(void){
    unsigned char some_array[30] = INITIALIZE_LIST;
    size_t size = INITIALIZE_LIST_SIZE;
    printf("Number of initialize list is %zu\n", size);
    for(size_t i = 0; i < size; ++i)
        printf("%02X ", some_array[i]);
    return 0;
}
2
BLUEPIXY 28 Апр 2016 в 05:11

Если вы определяете элемент как «что угодно, кроме 0x00», то это сделает цикл for.

int len = sizeof (some_array) / sizeof (some_array[0]);
int count = 0;
for(int i = 0 ; i < len; i++)
{
    if (some_array[i] != 0x00) count++;
}
/* count is now the number of non 0 elements */

Основываясь на вашем комментарии, похоже, что у вас есть массив из 30 элементов, но вы заполняете только первые 15 и хотите, чтобы 15 были «ответом». В массиве по-прежнему 30 элементов, и нет способа (насколько я знаю) определить из массива, что вы поместили в него только 15 значений.

2
John3136 28 Апр 2016 в 05:06

Количество элементов в массиве - 30.

Если вы хотите узнать количество элементов, которым вы присвоили значения, вам нужно будет отслеживать их явно. Невозможно отличить элемент массива с некоторым присвоенным значением от неинициализированного элемента, значение которого (мусор) совпадает с тем же значением.

2
Keith Thompson 28 Апр 2016 в 05:04