如何将 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&lt;const char *&gt; 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

如何将std :: vector的大小作为int?

用文件中的另一个词替换特定词[关闭]

如何将 xarray 转换为 std::vector?

如何将 std::vector<thrust::device_vector<int>> 转换为 int**?

如何将 std::vector<std::string> 转换为 C api 的 char*[] [重复]