0

如何获取 const char* 数组索引的长度?

向量:

std::vector<const char*> _infoBarText;

常量字符* []:

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

将 char 数组分配给向量:

_infoBarText.assign(text, text+4);

如何"current T"从向量中获取单个字符串的长度,例如 ?

4

2 回答 2

7

原始C字符串(裸char*-s)不适合现代C++代码。

如果您将其更改为std::vector<std::string_view>您可以在没有(实际上)任何开销的情况下解决您的问题(假设您使用文字对其进行初始化),并且作为奖励,您可能会使其更安全和更可用。

有关详细信息,请参阅cppreference 文章

示例(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代码洞察输出(注意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;
}
于 2018-09-07T15:39:22.547 回答
2

漫长的道路:

#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);

短的:

auto len = std::strlen(_infoBarText[0]);
于 2018-09-07T15:34:24.550 回答