编辑: 在实现 James Hopkin 的建议后,我仍然收到“无效名称‘null’”的警告,这比那些奇怪的字符要好得多。然后,我回去再次阅读库文档,结果发现对于那个特定的函数,它的参数应该比 aNames 的大小多一个非 NULL 字符串元素。该附加字符串还有其他用途。再添加一个字符串后,代码运行正常。都是我的错,我很抱歉。
原帖:
你好,
这是我的第一篇文章,所以请多多关照。我在这个论坛上搜索并用谷歌搜索,但我仍然找不到答案。这个问题困扰了我一天多了,请大家帮帮忙。谢谢。
我需要将字符串 vector 传递给库函数 foo(char const *const *const)。我不能传递 &Vec[0] 因为它是一个指向字符串的指针。因此,我有一个数组并将 c_str() 传递给该数组。以下是我的代码(aNames是字符串的 vector ):
const char* aR[aNames.size()];
std::transform(aNames.begin(), aNames.end(), aR,
boost::bind(&std::string::c_str, _1));
foo(aR);
但是,它似乎会导致一些未定义的行为:
如果我运行上面的代码,函数 foo 会在 aR 中抛出一些关于非法字符 ('èI' blablabla) 的警告。
如果我像这样在函数 foo 之前打印 aR:
std::copy(aR, aR+rowNames.size(),
std::ostream_iterator<const char*>(std::cout, "\n"));
foo(aR);
然后,一切都很好。 我的问题是:
转换是否会导致未定义的行为?如果是,为什么?
将字符串 vector 传递给 foo(char const *const *const) 的正确方法是什么?
最佳答案
因为 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]);
关于c++ - 如何将字符串 vector 传递给 foo(char const *const *const)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2883602/