c++ - 如何将字符串 vector 传递给 foo(char const *const *const)?

标签 c++ string vector char

编辑: 在实现 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);

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

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

  2. 将字符串 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/

相关文章:

c++ - 包含在 MacOS 上使用 g++ 编译时未找到的路径

c++ - 如何使 C++ 编译器接受 2_147_483.78 作为有效的 float

c++ - int to void* - 避免 c 风格的转换?

c++ - 在子字符串后插入字符串

java - 如何以预定义格式表示 JSON 字符串中的键值?

c++ - 尝试通过 tcp 发送 vector

c++ - 有效地连接几个 vector

c++ - Visual C++ - 虚拟方法未被覆盖

optimization - Haskell:列表/向量/数组性能调优

android - 如何在多行文本的行尾添加 ImageSpan