std :: vector <std :: string>到char*数组

Chr*_*ois 30 c c++ stl stdvector

我有一个std::vector<std::string>我需要用于C读取的函数的参数char* foo.我已经看到 如何转换std::stringchar*.作为新手C++,我正在尝试拼凑如何在矢量的每个元素上执行此转换并生成char*数组.

我已经看到了几个密切相关的SO问题,但大多数问题似乎都说明了朝着另一个方向发展的方法std::vector<std::string>.

Naw*_*waz 35

您可以使用std::transform:

std::transform(vs.begin(), vs.end(), std::back_inserter(vc), convert);  
Run Code Online (Sandbox Code Playgroud)

这要求您实施convert()为:

char *convert(const std::string & s)
{
   char *pc = new char[s.size()+1];
   std::strcpy(pc, s.c_str());
   return pc; 
}
Run Code Online (Sandbox Code Playgroud)

测试代码:

int main() {
       std::vector<std::string>  vs;
       vs.push_back("std::string");
       vs.push_back("std::vector<std::string>");
       vs.push_back("char*");
       vs.push_back("std::vector<char*>");
       std::vector<char*>  vc;

       std::transform(vs.begin(), vs.end(), std::back_inserter(vc), convert);   

       for ( size_t i = 0 ; i < vc.size() ; i++ )
            std::cout << vc[i] << std::endl;

       for ( size_t i = 0 ; i < vc.size() ; i++ )
            delete [] vc[i];
}
Run Code Online (Sandbox Code Playgroud)

输出:

std::string
std::vector<std::string>
char*
std::vector<char*>
Run Code Online (Sandbox Code Playgroud)

在线演示:http://ideone.com/U6QZ5

您可以&vc[0]在任何需要的地方使用char**.

请注意,因为我们正在使用new为每个std::string(在convert函数中)分配内存,所以我们要在最后释放内存.这使您可以灵活地更改矢量vs; 你可以有push_back更多的字符串,从中删除现有的vs,和vc(即vector<char*>仍然有效!

但如果您不想要这种灵活性,那么您可以使用此convert功能:

const char *convert(const std::string & s)
{
   return s.c_str();
}
Run Code Online (Sandbox Code Playgroud)

你已经改变std::vector<char*>std::vector<const char*>.

现在改造后,如果您更改vs通过插入新的字符串,或通过删除其旧的,那么所有char*vc可能变得无效.这是一个重点.另一个重点是,您不再需要delete vc[i]在代码中使用.


Nic*_*las 10

你能做的最好的是一个分配std::vectorconst char*大小相同的载体.然后,遍历向量的每个元素,调用c_str()以获取字符串数组并将其存储在数组的相应元素中.然后,您可以将指针传递给此向量的第一个元素到相关函数.

代码如下所示:

std::vector<const char *> cStrArray;
cStrArray.reserve(origVector.size());
for(int index = 0; index < origVector.size(); ++index)
{
  cStrArray.push_back(origVector[index].c_str());
}

//NO RESIZING OF origVector!!!!

SomeCFunction(&cStrArray[0], cStrArray.size());
Run Code Online (Sandbox Code Playgroud)

需要注意的是,你不能让时间之间进行调整字符串的原始载体,您将获取const char*从S std::strings,和一次调用C函数.


GWW*_*GWW 7

这应该工作:

char ** arr = new char*[vec.size()];
for(size_t i = 0; i < vec.size(); i++){
    arr[i] = new char[vec[i].size() + 1];
    strcpy(arr[i], vec[i].c_str());
}
Run Code Online (Sandbox Code Playgroud)

编辑:

这里是你如何释放这些数据结构,假设vec仍然具有正确数量的元素,如果你的C函数修改这个数组,你可能需要以另一种方式获得大小.

for(size_t i = 0; i < vec.size(); i++){
    delete [] arr[i];
}
delete [] arr;
Run Code Online (Sandbox Code Playgroud)

再次编辑:

如果C函数不修改字符串,则可能没有必要复制字符串.如果你能详细说明你的界面是什么样的,我相信我们可以为你提供更好的帮助.