【问题标题】:How to conver std::vector<std::string> to char*[] for C api [duplicate]如何将 std::vector<std::string> 转换为 C api 的 char*[] [重复]
【发布时间】: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。

标签: c++ c arrays c-strings


【解决方案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++。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多