微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将vector <char *>转换为char **数组?

如何解决将vector <char *>转换为char **数组?

我正在尝试将vector 转换为char **数组。当我打印parsed [0]时,我得到了垃圾。我该如何解决

char **parse(vector<string> arr){
   vector<char*> res;

   for(int i = 1; i < arr.size(); i++){
       string s = arr.at(i);
       char temp[s.length() + 1];
       s.copy(temp,s.length()+1);
       temp[s.length()] = '\0';

       res.push_back(temp);
   }

    res.push_back(NULL);
    char **parsed = res.data();

    cout << parsed[0] << endl; 

    return parsed; 
}

解决方法

仅调用标题为vector<char*>.data()的标题似乎是最直接的方法:

#include <type_traits>
#include <vector>

int main()
{
    std::vector<char*> chars{};
    static_assert(std::is_same_v<char**,decltype(chars.data())>);
}
,

这似乎是一个非常复杂的方法:

#include <algorithm>
#include <vector>
#include <iostream>
#include <string>

std::vector<const char*> to_ptrs(const std::vector<std::string>& arr) {
  std::vector<const char*> res;

  for (auto& s : arr) {
    res.emplace_back(s.c_str());
  }

  return res;
}

int main() {
  std::vector<std::string> input = {
    "test","example","of","strings"
  };

  auto ptr_vec = to_ptrs(input); // To avoid dangling temporary
  const char** result = ptr_vec.data();

  for (size_t i = 0; i < input.size(); ++i) {
    std::cout << result[i] << std::endl;
  }

  return 0;
}

或者如果您更喜欢使用std::transform的C ++ 20解决方案:

std::vector<const char*> to_ptrs(const std::vector<std::string>& arr) {
  std::vector<const char*> res;

  std::transform(arr.begin(),arr.end(),std::back_inserter(res),[](const std::string& s) -> const char* { return s.c_str(); });

  return res;
}

无法将笔记转换为char**,因为c_str()的结果为const char*

注意:对原始字符串或字符串数​​据的任何更改都会使这些指针无效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。