如何将 std::vector<std::string> 转换为 C api 的 char*[] [重复]
Posted
技术标签:
【中文标题】如何将 std::vector<std::string> 转换为 C api 的 char*[] [重复]【英文标题】:How to conver std::vector<std::string> to char*[] for C api [duplicate] 【发布时间】:2020-03-07 05:13:51 【问题描述】:API 需要一个以零结尾的 c 字符串 (char*) 数组。数组本身将以空指针 (nullptr) 终止。
【问题讨论】:
能否在您的问题中添加 API? 数组本身要以空指针(nullptr)终止是什么意思。?你能详细说明一下吗? @Azeem C 风格的字符串数组是char*
的数组。这些char*
中的每一个都将指向一个以null 结尾的字符串,除了数组中的最后一个条目。数组中的最后一项是nullptr
,因此不需要传递数组的大小。 (这个界面我以前见过,但是忘记在哪里了。)
@JaMiT:知道了,谢谢! :)
@Azeem 我在 posix 中使用 exec 函数系列。需要数组作为参数的 exec 系列函数的名称中包含 v 或 e。
【参考方案1】:
使用 std::transform 怎么样?
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
int main()
std::vector<std::string> v = "asd","qwe";
const char** c = new const char*[v.size()];
std::transform(v.begin(), v.end(), c, [](const std::string& s) return s.c_str(); );
for (size_t i=0;i<v.size();i++)
std::cout << c[i] << std::endl;
delete[] c;
return 0;
但请注意,数组(此处为 c
)应与向量(此处为 v
)在同一范围内,否则向量不应在使用数组(c
)结束之前被销毁.
如果您想要 char**
而不是 const char**
,您可以使用 .data()
而不是 .c_str()
【讨论】:
您不必手动分配数组。我会使用std::vector<const char *> s;
。
@HolyBlackCat 然后使用 s.data() 访问底层数据?
@theWiseBr® 是的。
@@theWiseBr® @HolyBlackCat 是啊,直接使用new和delete是草率的C++。以上是关于如何将 std::vector<std::string> 转换为 C api 的 char*[] [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何将 std::vector<std::vector<double>> 转换为 Rcpp::Dataframe 或 Rcpp::NumericMatrix