有一个需要const char*数组的函数,基本上是一个单词列表。因为这个单词列表可能会改变,所以我不能在程序开始时声明和初始化这个数组。现在,我有一个字符串向量,我需要将其转换为const char*数组。应该如何做?谢谢!
示例:
std::vector<std::string> list;
list.push_back("word1");
list.push_back("word2"); // and so on...
const char* wordList[] = ???
有一个需要const char*数组的函数,基本上是一个单词列表。因为这个单词列表可能会改变,所以我不能在程序开始时声明和初始化这个数组。现在,我有一个字符串向量,我需要将其转换为const char*数组。应该如何做?谢谢!
示例:
std::vector<std::string> list;
list.push_back("word1");
list.push_back("word2"); // and so on...
const char* wordList[] = ???
无论如何,你都会遇到一些复杂的生命周期问题,但我认为这是最简单的方法:
std::vector<const char*> ptrs;
for (std::string const& str : list) {
ptrs.push_back(str.data());
}
如果您需要使用const char**
,可以调用ptrs.data()
。问题在于,ptrs
和list
都必须保持活动状态,以使ptrs.data()
有效。
还要注意的另一件事是,如果向list
添加更多元素,则可能会重新分配list
,这将使ptrs
中的指针无效。
你无法将它转换,但创建一个数组很简单:
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
更长的时间。data()
和c_str()
有什么真正的区别? - Sandburgdata()
函数。 - François Andrieux
char const **
的完美示例,您的问题是否还有其他未在另一个答案中回答的内容? - Guillaume Racicotconst char ** wordList
,即使函数参数声明为const char* wordList[]
。 - Caleth