将向量<字符 *> 转换为字符 ** 数组?



我正在尝试转换一个向量<char*>转换为char**数组。当我打印解析的[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()] = '';
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;
}

注意,由于c_str()的结果是const char*,因此不可能转换为char**

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