C++ Get length of const char* [ ] in vector

3k Views Asked by At

How do I get the length of const char* arrays indexes?

The vector:

std::vector<const char*> _infoBarText;

The const char* []:

const char* text[4] = {"Current T:", "Target T:", "Time elapsed:", "Time remaining:"};

Assigning the char array to the vector:

_infoBarText.assign(text, text+4);

How can I get the length of the individual strings, like "current T", from the vector?

2

There are 2 best solutions below

2
tstenner On

The long way:

#include <vector>
#include <cstring> // for strlen

std::vector<const char*> _infoBarText;
char const *str = _infoBarText[0]; // or any other valid index
auto len = std::strlen(str);

Short:

auto len = std::strlen(_infoBarText[0]);
5
bobah On

Raw C strings (bare char*-s) are not a perfect fit for modern C++ code.

If you change it to std::vector<std::string_view> you get your problem solved without (virtually) any overhead (given you are initializing it with literals) and as a bonus you will potentially make it safer and more usable.

See the cppreference article for details.

Example (GodBolt):

#include <string_view>
#include <vector>
#include <iostream>

int main() {
    using namespace std::literals;

    std::vector<std::string_view> strs = { "hello"sv, "there"sv };

    for (auto&& str: strs)
        std::cout << str << str.size();

    return 0;
}

GodBolt Code Insight Output (note the std::operator""sv("hello", 5ul)):

#include <string_view>
#include <vector>
#include <iostream>

int main()
{
  using namespace std::literals;
  std::vector<std::string_view> strs = std::vector<std::basic_string_view<char, std::char_traits<char> >, std::allocator<std::basic_string_view<char, std::char_traits<char> > > >{std::initializer_list<std::basic_string_view<char, std::char_traits<char> > >{std::operator""sv("hello", 5ul), std::operator""sv("there", 5ul)}, std::allocator<std::basic_string_view<char, std::char_traits<char> > >()};
  {
    std::vector<std::basic_string_view<char, std::char_traits<char> >, std::allocator<std::basic_string_view<char, std::char_traits<char> > > > & __range = strs;
    __gnu_cxx::__normal_iterator<std::basic_string_view<char, std::char_traits<char> > *, std::vector<std::basic_string_view<char, std::char_traits<char> >, std::allocator<std::basic_string_view<char, std::char_traits<char> > > > > __begin = __range.begin();
    __gnu_cxx::__normal_iterator<std::basic_string_view<char, std::char_traits<char> > *, std::vector<std::basic_string_view<char, std::char_traits<char> >, std::allocator<std::basic_string_view<char, std::char_traits<char> > > > > __end = __range.end();

    for( ; __gnu_cxx::operator!=(__begin, __end); __begin.operator++() )
    {
      std::basic_string_view<char, std::char_traits<char> > & str = __begin.operator*();
      std::operator<<(std::cout, std::basic_string_view<char, std::char_traits<char> >(str)).operator<<(str.size());
    }
  }
  return 0;
}