1

我正在尝试将字符串转换为 aconst*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()

编译器总是抛出各种错误,当我修复另一个错误时(从我使用的解决方案/google-fu 看来相当循环)。

4

2 回答 2

6

的签名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]);
于 2013-02-19T15:45:44.070 回答
2

有两个基本问题需要解决。第一个是编译器错误:指向的数组中的指针myTconst,因此您不能分配给它们。使myT char const** myT;. 第二个问题是您分配给它们的是指向局部变量的指针,当它超出范围时将被破坏,因此指针将悬空。

你调用的函数最后真的需要额外的空格吗?(你在某处提到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;做类似的事情。否则,只需自己编写循环。

如果您确实需要以myVec某种方式转换字符串,最好的解决方案仍然是将它们复制到 second std::vector<std::string>中,并使用转换,然后使用它。

(顺便说一句:你真的想通过在循环中的每个元素上myVec使用来修改 , 的内容吗?)+=

于 2013-02-19T15:45:37.637 回答