有一个函数需要一个const char *数组,基本上是一个单词列表。由于此单词列表可能会更改,因此我无法在程序启动时声明并初始化此数组。现在,我有一个向量字符串,需要将其转换为const char *数组。如何才能做到这一点?谢谢!
示例:
std::vector<std::string> list;
list.push_back("word1");
list.push_back("word2"); // and so on...
const char* wordList[] = ???
答案 0 :(得分:5)
无论如何,您都会遇到一些复杂的生命周期问题,但是我认为这是最简单的方法:
std::vector<const char*> ptrs;
for (std::string const& str : list) {
ptrs.push_back(str.data());
}
如果您需要const char**
,可以致电ptrs.data()
。当然,问题在于ptrs
和list
必须都活着才能使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
的危险。