我有一个函数,它将const char **数组作为参数
void Foo(const char** bar);
我可以将const char *数组传递给它
const char *bar[2];
bar[0] = "test";
bar[1] = "me";
Foo(bar); // works fine
当'bar'是std :: string数组而不是const char *时,我想做同样的事情
std::string bar[2];
bar[0] = "test";
bar[1] = "me";
Foo(bar); // cannot convert argument 1 from 'std::string [1]' to 'const char **'
我知道将std :: string转换为const char *的方式。在上述情况下有什么办法可以解决我的问题
答案 0 :(得分:1)
不知道您要达到的目标是什么
// Example program
#include <iostream>
#include <string>
void Foo(const char** bar, int num) {
while(num > 0) {
std::cout << bar[--num] << std::endl << std::flush;
}
}
const char** toCharArray(std::string* arr, int num) {
// If we ever alloc with new with have to delete
const char** buffer = new const char*[num];
for(int i = 0; i < num; i++) {
buffer[i] = arr[i].c_str();
}
return buffer;
}
int main()
{
std::string bar[2];
bar[0] = "test";
bar[1] = "me";
// Capture the result
const char** charBar = toCharArray(bar, 2);
Foo(charBar, 2);
// So we can free it later
delete[] charBar;
}
与其他语言不同,内存中的数组没有length
或size
成员,因此我们通过函数参数传递大小。其次,由于我们要传递一个字符串数组并从中获取一个字符数组,因此我们需要动态地构建另一个数组。唯一的方法就是使用new。这会将字符存储在堆中而不是堆栈中,因此当函数toCharArray
完成时,数据将继续存在。因此,我们将结果存储在charBar
中,以便以后可以delete[]
数组。
答案 1 :(得分:-1)
您不能直接做
auto arr = std::vector<const char*>();
auto s1 = std::string("test");
auto s2 = std::string("me");
arr.push_back(s1.c_str());
arr.push_back(s2.c_str());
Foo(arr.data());
答案 2 :(得分:-1)
有很多方法可以做到这一点。最明显的一种是重载函数:
void Foo(const char** bar);
void Foo(std::string bar[]);
const char *bar1[2];
bar1[0] = "test";
bar1[1] = "me";
std::string bar2[2];
bar2[0] = "test";
bar2[1] = "me";
Foo(bar1);
Foo(bar2);
如果您不想重载该函数,则可以简单地先将字符串数组转换为char *数组,如下所示:
std::string bar[2];
bar[0] = "test";
bar[1] = "me";
std::vector<const char*> barVector(bar->length());
for (int i = 0; i < bar->length(); i++) {
barVector[i] = bar[i].c_str();
}
Foo(barVector.data());