Нужно узнать длину массива строк

246
09 октября 2017, 00:51

Имеется тип string из std, нужно узнать длину массива этого типа.

std::string arrayT [] = {"value1", "value2", "value3"};
std::cout << sizeof (arrayT) << std::endl;

Всегда возвращает 8, независимо от кол-ва ключей/значений.

Есть другие варианты?

Оригинальный код:

string arrayT [] = {"value1", "value2", "value3", "value4", "value5", "value6"};
json.setString (arrayT, "testValue");
void JSON::setString (string key [], string value)
{
  std::wcout << sizeof (key) << std::endl;
}

Вывод: 8

Answer 1

Совершенно не важно какого типа у вас массив. Для выяснения количества элементов любого массива достаточно поделить общий размер массива в байтах на размер отдельного элемента:

sizeof(array) / sizeof(element);

Чтобы явно не указывать в этом выражении тип элемента можно использовать либо оператор разыменования *, или указать элемент по индексу (обычно используют 0):

sizeof(array) / sizeof(*array);
sizeof(array) / sizeof(array[0]);

Видно, что вариант с разыменованием самый лаконичный.

Чтобы, тем не менее, не повторять это деление компилятор от Microsoft предоставляет для этих целей макрос _countof:

_countof(array);

Если не хочется использовать макросы (а их лучше НЕ использовать, если есть такая возможность), то можно написать шаблонную функцию, принимающую ссылку на массив:

template <typename T, std::size_t N>
constexpr std::size_t countof(T const (&)[N]) noexcept
{
    return N;
}

В с++17 для этих целей появилась функция std::size:

std::size(array);

Проблема с выводом 8 в коде заключается в том, что при передаче в функцию массив вырождается в указатель и таким образом sizeof даёт размер указателя. Именно поэтому часто приходится наблюдать передачу пары аргументов - указатель и размер данных по этому указателю.

Хотите иметь возможность сохранять размер - используйте std::array или std::vector при передаче в функцию. Тогда всегда сможете вызвать для них функцию-член size или упомянутую выше std::size, если компилятор позволяет.

Answer 2

sizeof - это унарный оператор, возвращающий длину в байтах переменной или типа, помещенных в скобки. Можно сделать так:

std::string arrayT [] = {"value1", "value2", "value3"};
std::cout << (sizeof(arrayT)/sizeof(*arrayT)) << std::endl;
return 0;
Answer 3

Разделите размер массива на размер std::string и узнаете длину массива.

#include <iostream>
int main()
{
  std::string arrayT [] = {"value1", "value2", "value3"};
  size_t arrSize = sizeof(arrayT) / sizeof(std::string);
  std::cout << arrSize << std::endl;
  return 0;
} 
READ ALSO
Даны два массива целых чисел одинаковой длины. Необходимо найти первую пару индексов

Даны два массива целых чисел одинаковой длины. Необходимо найти первую пару индексов

Даны два массива целых чисел одинаковой длины A[0n−1] и B[0

495
Заменить каждый пятый элемент в векторе на &#39;0&#39; с помощью алгоритмов

Заменить каждый пятый элемент в векторе на '0' с помощью алгоритмов

Есть вектор целых чиселНужно только с помощью стандартных алгоритмов STL заменить каждый пятый элемент на 0

207
Добавить переносы в список value

Добавить переносы в список value

Доброго времени суток, помогите решить задачуСделал скрипт на лендинге который по кнопке отправляет товар к корзину

224
Задержка анимации при при наведенном hover

Задержка анимации при при наведенном hover

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

185