微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将向量转换为char ** C

我有一个向量< std :: string>变量.我需要将它传递给接受char **作为输入参数的方法.

怎么办?如果可能,我需要通过一个可写的.

更新1:
在创建服务方法的工具中,我给参数作为std :: vector,但它会自动将限定符设置为&,这意味着我的方法定义将由以下工具生成

std::string SvcImpl::myMethodname ( const std::string par1,const std::vector<     std::string >& par2,const std::vector< std::string >& par3 )
{

}

自动调用方法,通过传递的参数中的值.
现在从这个方法里面我将在lib文件夹中的一个dll中调用一个方法,如下所示:

int method_to_be_called(char* par1,char ** par2,char ** par3,void* pRetValue);

对于par1 – >我正在传递(char *)par1.c_str()

我需要知道如何传递par2和par3以及pRetValue的变量.
par2和par3的值在向量中可用,但最后一个参数pRetValue是一个输出参数,我需要将其作为std :: string返回.

对不起,如果我很混乱或提出非常基本的问题.

解决方法

只要函数修改char **中的传递,就可以解决问题,而不会复制所有的std :: string.否则,我可以看到没有任何选择,只能将所有内容复制到一个新的char **`结构(见第二个例子).
void old_func(char** carray,size_t size)
{
    for(size_t i = 0; i < size; ++i)
        std::cout << carray[i] << '\n';
}

int main()
{
    std::vector<std::string> strings { "one","two","three"};
    std::vector<char*> cstrings;

    for(size_t i = 0; i < strings.size(); ++i)
        cstrings.push_back(const_cast<char*>(strings[i].c_str()));

    // Do not change any of the strings here as that will
    // invalidate the new data structure that relies on
    // the returned values from `c_str()`
    //
    // This is not an issue after C++11

    if(!cstrings.empty())
        old_func(&cstrings[0],cstrings.size());
}

示例2:如果函数必须修改传入的数据:

void old_func(char** carray,"three"};
    char** cstrings = new char*[strings.size()];

    for(size_t i = 0; i < strings.size(); ++i)
    {
        cstrings[i] = new char[strings[i].size() + 1];
        std::strcpy(cstrings[i],strings[i].c_str());
    }

    // Now the function can do what it likes (within the bounds)
    // with the passed in structure

    old_func(cstrings,strings.size());

    // clean up memory

    for(size_t i = 0; i < strings.size(); ++i)
        delete[] cstrings[i];

    delete[] cstrings;
}

EDIT5:解决一个更简单的解决方案,用于Post C 98代码(Thnx to BeyelerStudios)添加一个解决方案,允许该功能修改传入的数据.

原文地址:https://www.jb51.cc/c/114179.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐