Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++中向量的const char *[]的长度_C++_Vector_Const Char - Fatal编程技术网

C++中向量的const char *[]的长度

C++中向量的const char *[]的长度,c++,vector,const-char,C++,Vector,Const Char,如何获取const char*数组索引的长度 矢量: std::vector<const char*> _infoBarText; _infoBarText.assign(text, text+4); 将字符数组分配给向量: std::vector<const char*> _infoBarText; _infoBarText.assign(text, text+4); 如何从向量中获得单个字符串(如当前T)的长度?漫长的道路: #include <vect

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

矢量:

std::vector<const char*> _infoBarText;
_infoBarText.assign(text, text+4);
将字符数组分配给向量:

std::vector<const char*> _infoBarText;
_infoBarText.assign(text, text+4);
如何从向量中获得单个字符串(如当前T)的长度?

漫长的道路:

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

原始C字符串裸露字符*-S并不适合现代C++代码。 如果您将其更改为std::vector,您就可以在不增加任何开销的情况下解决您的问题,因为您正在使用文本对其进行初始化,并且作为一项额外的功能,您可能会使它更安全、更可用

有关详细信息,请参阅

例如:


用同样的方法计算任何C样式字符串的长度。但为什么一开始就使用C样式的字符串呢?当使用const char*引用字符串文本时,这些信息就会丢失。您必须再次计数字符,通常使用std::strlen。我建议使用std::vector。那么你只需要向量名[index].size为什么还要引入str呢?自动len=strlen_infoBarText[0];同样如此thing@NathanOliver当然,但这样做更容易弥合索引向量和将const*char传递给strlen之间的心理鸿沟。请注意,在构建向量时,每个c字符串都会有一个ON遍历,以获得其大小。@FrançoisAndrieux-谢谢,更正了错误answer@NathanOliver-不,不是文字。你能指出它是如何得到大小的吗?它只有一个指针,构造函数说它调用Traits::length,这需要遍历。@NathanOliver-添加了一个示例,请看一看
#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;
}
#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;
}