4

私は現在、非常に基本的なシェルとして機能するクラスの割り当てを作成しています。私はほぼ完成していexecvpますが、パラメーターの文字配列で問題が発生しています。これが私のコードの軽いスニペットです。

//Split the left content args
istringstream iss(left);
while(getline(iss, s, ' ')){
     v.push_back(s);
}

//Get the split string and put it into array
const char* cmd_left[v.size()+1];
for(unsigned int i = 0; i < v.size(); i++){
     cmd_left[i] = v.at(i).c_str();
}
cmd_left[v.size()] = 0;
v.clear();

そして、これはによって利用されています...

execvp(cmd_left[0], cmd_left);

私のエラーは

assign3.cxx:96:34: error: invalid conversion from ‘const char**’ to ‘char* const*’ [-fpermissive]

問題は、文字配列が定数データでいっぱいではないことであることを理解しているので、基本的に からconst char*に移動する必要がありconst char* constます。について何かを読みましたがconst_cast、それが私がしなければならないことかどうかわかりませんでした。

よろしければ、私の文字配列の配列がその関数で適切に受け入れられるように手伝っていただけませんか? 私のコードをもっと投稿する必要がある場合は、お知らせください。

ありがとう

4

3 に答える 3

0

すべての要素を初期化子 {} 内で宣言する必要があるため、要素の const 動的配列を作成するのは簡単ではなく、場合によっては不可能です。しかし幸いなことに、渡す配列が少なくとも特定の期間は const になることをコンパイラに伝えることができます。次のようにすると、次のようになります

&((char* const) (const_cast<char*>(cmd_left[0]) ))

内部の const_cast は、 std::string が所有する文字配列の const-ness を削除します。そのため、関数が std::string の後ろにある文字配列の内容を変更する可能性は十分にあります。そのような引数をとる関数の動作がわかっている場合、これで問題ないかもしれません。

const_cast に頼ったり、new/delete を使用してメモリを管理したりせずに char* の const 配列を作成する場合は、文字列の vector の代わりに std::vector > を使用できます。

istringstream iss(left);
while(getline(iss, s, ' ')){
     v.push_back(std::vector<char>(s.length()+1));
     strcpy(&v.back().front(),s.c_str());
}

//Get the split string and put it into array
char* cmd_left[v.size()+1];
for(unsigned int i = 0; i < v.size(); i++){
     cmd_left[i] = &v.at(i).front();
}
cmd_left[v.size()] = 0;
v.clear();
execvp(cmd_left[0], &((char* const)cmd_left[0]));

お役に立てれば。

于 2013-04-12T02:50:46.133 に答える