1

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

の2番目のパラメーターに対してこれを作成していますexecv()

コンパイラは常にさまざまなエラーをスローし、お互いを修正するとポップアップが表示されます(私が採用したsolutions / 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

対処する必要がある2つの基本的な問題があります。1つ目はコンパイラエラーです。が指す配列内のポインタはでmyTあるconstため、それらに割り当てることはできません。作るmyT char const** myT;。2番目の問題は、それらに割り当てているのがローカル変数へのポインターであり、スコープ外になると破棄されるため、ポインターがぶら下がることです。

あなたが呼んでいる関数は本当に最後に余分な空白を必要としますか?(あなたは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何らかの方法で 文字列を変換する必要がある場合でも、最善の解決策はstd::vector<std::string>、変換を使用して文字列を2番目にコピーし、これを使用することです。

(ところで:ループ内の各要素myVecを使用して、の内容を本当に変更しますか?)+=

于 2013-02-19T15:45:37.637 に答える