如何将“ std :: vector <std :: string>”转换为“ const char * array”?

时间:2019-02-04 15:17:45

标签: c++ arrays string char

有一个函数需要一个const char *数组,基本上是一个单词列表。由于此单词列表可能会更改,因此我无法在程序启动时声明并初始化此数组。现在,我有一个向量字符串,需要将其转换为const char *数组。如何才能做到这一点?谢谢!

示例:

std::vector<std::string> list;
list.push_back("word1");
list.push_back("word2"); // and so on...

const char* wordList[] = ???

2 个答案:

答案 0 :(得分:5)

无论如何,您都会遇到一些复杂的生命周期问题,但是我认为这是最简单的方法:

std::vector<const char*> ptrs;
for (std::string const& str : list) {
  ptrs.push_back(str.data());
}

如果您需要const char**,可以致电ptrs.data()。当然,问题在于ptrslist必须都活着才能使ptrs.data()有效。

需要注意的另一件事是,如果您向push_back list添加更多元素,则list可能会重新分配,这会使ptrs中的指针无效。

答案 1 :(得分:4)

您无法转换,但是创建数组很简单:

std::vector<const char*> strings;
for (int i = 0; i < list.size(); ++i)
    strings.push_back(list[i].c_str();

现在,strings.data()为您提供了const char*的数组。

请注意,strings被销毁后不应再使用list,因为它保存着指向list中的数据的指针。我可能会将其包装在一个函数中:

void call_C_function(const std::vector<std::string>& list) {
    std::vector<const char*> strings;
    for (int i = 0; i < list.size(); ++i)
        strings.push_back(list[i].c_str());
    c_function(strings.data());
}

这样,strings将仅通过对c_function的调用而存在,并且没有持久性list的危险。