Размер статического массива

Объявляю статический массив char, затем передаю его функции. Как получить нет. байтов в массиве внутри функции?

Ответ 1

Вам нужно будет передать его функции. Вы можете использовать sizeof(), чтобы получить размер массива.

const char foo[] = "foobar";

void doSomething( char *ptr, int length)
{

}


doSomething(foo, sizeof(foo));

Эта страница MSDN объясняет больше о sizeof и имеет больший пример.

Изменить: * см. ответ j_random_hacker для интригующей техники с использованием шаблонов... *

Ответ 2

Вместо этого используйте шаблон функции, который имеет параметр шаблона непигового типа:

template <size_t N>
void func(char (&a)[N]) {
    for (int i = 0; i < N; ++i) {
        cout << "a[" << i << "] = " << a[i] << endl;   // Or whatever you want to do
    }
}

Для вызова:

char myArray[500];        // Or "static char myArray[500]", if you want
func(myArray);

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

Ответ 3

Нет. Не используйте массивы. Вместо этого используйте вектор. В наши дни почти нет оправдания для использования массивов, потому что они небезопасны. AFAIK, они являются одной из основных причин проблем с программным обеспечением, потому что это настолько просто, чтобы случайно перехватить конец массива.

Используя вектор, вам больше не нужно беспокоиться о переполнении буфера. И ваша функция может легко узнать размер vecor.

#include <vector>
vector<char> myVector;

void DoSomething(vector<char> &v)
{
    int sizeOfVector = v.size();
}

Ответ 4

int array_size = sizeof (Array)/sizeof (массив [0]);

Ответ 5

Вы не можете. Массивы в С++ - это указатели, и это все, что у вас есть: указатель на начало массива. Если это строка, вы можете использовать strlen для измерения ее длины. Если его другой известный формат, вы можете рассчитать длину в соответствии с этим форматом.

Рассмотрим этот код:

static char str[] = "hello world";

foo(str);
bar(str);

void foo(char* str)
{
   // length of str is unknown
}

void bar(char str[])
{
  // length of str is still unknown
}

Независимо от того, является ли ваш параметр функции char [] или char *, вы не знаете размер.

Я предлагаю передать размер в качестве отдельного параметра.

Ответ 6

Еще один вариант, который у вас есть, - это создать класс строк, который управляет строкой. Я уверен, что кто-то там уже сделал это. Наиболее примитивной версией является структура с char * и длиной буфера, где вам нужно вручную управлять размером при каждом изменении. Другой конец спектра представляет собой полностью реализованный класс строк с функциями перегрузки и manupulation оператора.

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