将字符串数组传递给需要const char **的函数

时间:2018-10-08 17:57:24

标签: c++ arrays

我有一个函数,它将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 *的方式。在上述情况下有什么办法可以解决我的问题

3 个答案:

答案 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;
}

与其他语言不同,内存中的数组没有lengthsize成员,因此我们通过函数参数传递大小。其次,由于我们要传递一个字符串数组并从中获取一个字符数组,因此我们需要动态地构建另一个数组。唯一的方法就是使用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());