如何将字符串向量传递给foo(char const*const*const)?

EXP*_*XP0 8 c++ string vector char

编辑:在实施James Hopkin的建议后,我仍然收到"无效名称'null'"的警告,这比那些怪异的角色要好得多.然后,我回去再次读取库文档,结果发现,对于该特定函数,它的参数应该有一个非NULL字符串元素而不是aNames的大小.额外的字符串有其他目的.添加一个字符串后,代码运行正常.这都是我的错,我很抱歉.

原帖:

嗨,

这是我的第一篇文章所以请你好.我在这个论坛搜索并用Google搜索,但我仍然找不到答案.这个问题困扰了我一天多,所以请给我一些帮助.谢谢.

我需要将一个字符串向量传递给库函数foo(char const*const*const).我不能传递&Vec [0],因为它是一个指向字符串的指针.因此,我有一个数组并将c_str()传递给该数组.以下是我的代码(aNames是字符串的向量):

const char* aR[aNames.size()];

std::transform(aNames.begin(), aNames.end(), aR, 
                boost::bind(&std::string::c_str, _1));
foo(aR);
Run Code Online (Sandbox Code Playgroud)

但是,它似乎导致一些未定义的行为:

如果我运行上面的代码,那么函数foo会在aR中抛出一些关于非法字符('èI'blablabla)的警告.

如果我在函数foo之前打印aR,如下所示:

std::copy(aR, aR+rowNames.size(), 
          std::ostream_iterator<const char*>(std::cout, "\n"));
foo(aR);
Run Code Online (Sandbox Code Playgroud)

然后,一切都很好.我的问题是:

  1. 转换是否会导致未定义的行为?如果是这样,为什么?

  2. 将字符串向量传递给foo(char const*const*const)的正确方法是什么?

Jam*_*kin 5

由于foo只需要一个指针,我的猜测是它需要一个以NULL结尾的数组.aR为其分配一个额外的元素并为其分配NULL.

我的建议是:

std::vector<const char*> c_strings;
c_strings.reserve(aNames.size() + 1);

std::transform(
    aNames.begin(), aNames.end(),
    std::back_inserter(c_strings), 
    boost::bind(&std::string::c_str, _1)
    );

c_strings.push_back(0);
foo(&c_strings[0]);
Run Code Online (Sandbox Code Playgroud)


neu*_*uro 1

嗯,这对我来说似乎是正确的。c_str 创建一个以 null 结尾的 char 数组,该数组在下一个非常量字符串操作之前一直保持不变。您将 c_str 指针存储在 const char* 数组中。

我不是 boost 专家,所以问题可能就在那里,但我的猜测是向量中的字符串采用的编码与函数 foo 中预期的编码不兼容。

从编码的角度检查您的代码。

我的2c