0

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?

SergeyA
  • 61,605
  • 5
  • 78
  • 137
Daan van Driel
  • 165
  • 1
  • 2
  • 9

2 Answers2

7

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;
}
bobah
  • 18,364
  • 2
  • 37
  • 70
2

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]);
Swordfish
  • 12,971
  • 3
  • 21
  • 43
tstenner
  • 10,080
  • 10
  • 57
  • 92
  • 2
    Why even introduce `str`? `auto len = strlen(_infoBarText[0]);` does the same thing – NathanOliver Sep 07 '18 at 15:35
  • 1
    @NathanOliver Of course, but that way it's easier to bridge the mental gap between indexing the vector and passing the const* char to strlen. – tstenner Sep 07 '18 at 15:35