从string构造char * const *

时间:2013-02-19 15:20:28

标签: c++ c string char const

我正在尝试将字符串转换为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()的第二个参数构建它。

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

2 个答案:

答案 0 :(得分: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]);

答案 1 :(得分:2)

有两个基本问题需要解决。该 首先是编译器错误:数组中的指针指向 myT constmyT,因此您无法分配给他们。制作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] ); 。 如果这是函数,额外的空格会造成更大的伤害 好的。)如果没有,你所要做的就是:

boost::bind

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

如果您确实需要以某种方式转换std::vector<std::string>中的字符串, 最好的解决方案仍然是将它们复制到第二个 myVec,通过转换和使用 此

(顺便说一下:你真的想修改+=的内容吗? 在循环中的每个元素上使用{{1}}?)