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

6

有一个需要const char*数组的函数,基本上是一个单词列表。因为这个单词列表可能会改变,所以我不能在程序开始时声明和初始化这个数组。现在,我有一个字符串向量,我需要将其转换为const char*数组。应该如何做?谢谢!

示例:

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

const char* wordList[] = ???

我不认为其他答案可以解决我的问题。也许有人可以给一个简短的例子? - Lemonbonbon
另一个答案展示了如何构建char const **的完美示例,您的问题是否还有其他未在另一个答案中回答的内容? - Guillaume Racicot
你只需要 const char ** wordList,即使函数参数声明为 const char* wordList[] - Caleth
2个回答

7

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

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

如果您需要使用const char**,可以调用ptrs.data()。问题在于,ptrslist都必须保持活动状态,以使ptrs.data()有效。

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


5

你无法将它转换,但创建一个数组很简单:

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

现在,strings.data()会给你一个由const char*组成的数组。

请注意,在list被销毁后,不应再使用strings,因为它保存了指向存储在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 更长的时间。

2
最好也要“保留”内存。 - NathanOliver
@hegel5000 vs @pete-becker:data()c_str()有什么真正的区别? - Sandburg
1
@NathanOliver -- 有很多变化。我选择这种最直接的方式来展示如何解决问题。我的目标是展示解决方案的一般形式,特别是澄清这是一个新对象而不是转换。 - Pete Becker
3
自C++11以来,它们执行相同的操作。编辑:尽管自C++17以来有一个非const的data()函数。 - François Andrieux
完美运行。谢谢! - Lemonbonbon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接