Объявляю статический массив 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 оператора.
Затем передайте этот класс вашей функции, и он уже знает размер. На самом деле это не совсем так, как передача отдельного параметра; это просто более простой способ управления строками, если они разные.