从字符串构造char*const*

constructing char*const* from string

本文关键字:const char 字符串      更新时间:2023-10-16

我正在尝试将字符串转换为const*char*,以便能够调用库函数。我的代码如下:

// myVec is simply a vector<string> 
vector<string> myVec;
/* stuff added to myVec
 * it is a vector of words that were seperated by whitespace
 * for example myVec[0]=="Hey"; myVec[1]=="Buck"; myVec[2]=="Rogers"; etc...
 */
char*const* myT = new char*[500]; //I believe my problem stems from here
for(int z=0; z<myVec.size(); z++) {
   string temp=myVec[z]+=" "; 
   myT[z]=temp.c_str();
}
//execv call here

我正在为execv()的第二个参数构造这个。

编译器总是抛出各种错误,当我修复另一个错误时,会弹出一个错误(从我使用的解决方案/谷歌功能来看,这似乎相当循环)。

execv的签名要求参数数组指向可修改的C风格字符串。因此,与其他答案相反,c_str()不是一个好主意。

虽然在C++03中没有保证,但事实是,我所知道的std::string的所有实现都将数据存储在一个连续的以NULL结尾的内存块中(这在C++11中得到了保证),所以你可以使用它来获得优势:创建一个指向可修改字符数组的指针向量,使用输入向量中字符串的缓冲区初始化值,并将该数据块的地址传递给execv:

std::vector<char*> args;
args.reserve(myVec.size()+1);
for (std::vector<std::string>::iterator it=myVec.begin(); it != myVec.end(); ++it) {
   args.push_back(&((*it)[0]);
}
args.push_back(0);   // remember the null termination:
execv("prog", &args[0]);

有两个基本问题需要解决。这个第一个是编译器错误:数组中指向的指针由myT指定的是const,因此不能分配给它们。制作myTCCD_ 10。第二个问题是你是什么分配给它们的是一个指向局部变量的指针当它超出范围时将被销毁,因此指针将悬挂。

你调用的函数真的需要额外的白色吗末端的空间?(我想你在什么地方提到了execv。如果是这样的函数,那么额外的空格会造成更大的伤害比好。)如果没有,你所要做的就是:

std::vector<char const*> myT( myVec.size() + 1 );
std::transform( myVec.begin(), myVec.end(), myT.begin(),
                []( std::string const& arg ) { return arg.c_str(); } );
execv( programPath, &myT[0] );

如果你不能指望C++11(通常情况仍然如此),你可能可以用boost::bind做一些类似的事情;否则,只需自己编写循环。

如果您确实需要以某种方式转换CCD_ 13中的字符串,最好的解决方案仍然是将它们复制到一秒钟内std::vector<std::string>,带转换,使用这

(BTW:你真的想修改myVec的内容吗在循环中的每个元素上使用+=?)