【问题标题】:C++: vector<string> to char** [duplicate]C++:vector<string> 到 char** [重复]
【发布时间】:2016-01-08 04:31:38
【问题描述】:

我正在将我的应用程序转换为能够用作库。为此,我想提供将字符串向量传递给库的默认运行例程的可能性。

我遇到的问题实际上是创建char**。这是我当前的实现,在源代码中注释掉了,因为它不起作用:

IceTea* IceTea::setupCli(vector<string> strings) {
    int argc=strings.size(), i=0;
    char* argv[argc];
    vector<string>::iterator it;
    for(it=strings.begin(); it != strings.end(); ++it) {
        argv[i++] = (char*)it->c_str();
    }

    // Pass the char** to the original method.
    return this->setupCli(argc, argv);
}

我得到的错误:

src/IceTea.cpp:132:18: error: no matching member function for call to 'setupCli'
    return this->setupCli(argc, argv);
           ~~~~~~^~~~~~~~
src/IceTea.h:44:13: note: candidate function not viable: no known conversion from 'char *[argc]' to 'const char **' for 2nd argument
    IceTea* setupCli(int, const char**);
            ^
src/IceTea.cpp:124:17: note: candidate function not viable: requires single argument 'strings', but 2 arguments were provided
IceTea* IceTea::setupCli(vector<string> strings) {

【问题讨论】:

  • char* argv[argc]; VLA 不是标准 c++
  • 第二个setupCli()函数是怎么声明的?
  • 你能显示两个参数的函数签名吗?
  • 只要声明const char* argv[argc];就可以了。
  • (char*)it-&gt;c_str() 很危险。不建议抛弃const

标签: c++ vector


【解决方案1】:

恐怕您无法在恒定时间内将vector&lt;string&gt; 转换为char**vector&lt;string&gt; 可以很容易地转换为string*string 可以很容易地转换为char*,但向量不能转换为char**。实际上,这是一个非常类似于为什么不能将int[10][20] 简单地转换为int** 的问题。

现在,如果你绝对必须这样做,那么

vector<char*> pointerVec(strings.size());
for(unsigned i = 0; i < strings.size(); ++i)
{
    pointerVec[i] = strings[i].data();
} //you can use transform instead of this loop
char** result = pointerVec.data();

您的代码的主要问题是您使用的是c_str,它返回一个const char *。请注意,我使用的是 data() 成员函数,它返回非常量指针。您的尝试和我的建议之间的另一个区别是您使用的数组长度不是常量表达式。这在标准 C++ 中是非法的。我改用了向量,后来将其转换为具有相同 data() 函数的指针。

【讨论】:

  • 在 Solaris 机器上的最后一行出现“错误:数据不是 std::vector 的成员”的错误
猜你喜欢
  • 2012-02-16
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 2014-05-16
  • 2011-10-26
  • 2012-01-06
  • 2010-12-03
相关资源
最近更新 更多