2016-04-16 16 views
0

私は文字列ベクトルvector<string> argsを持っています。これは、c文字列に変換してexecvp呼び出しで引数として実行する必要があります。私はエラーを取得し続けている "私のループの行のためのconst char *からchar *への無効な変換。私はこれを修正する方法を理解していない私はexecvpにフィードすることができます。私が遭遇したソリューションの私の問題を修正するように見える。ベクトルをexecvpに送る変換に間違ったタイプ

int argsLen = c->args.size(); 
    char **argv = new char* [c->args.size() + 1]; 
    for (int index = 0; index < c->args.size(); ++index) 
     argv[index] = c->args[index].c_str();//note that c is the structure in which args is contained 
    argv[c->args.size() + 1] = NULL; 

    //execvp(argv[0], argv); 

答えて

1

c_str()内容あなたが(ザッツなぜそのCONST)を変更することはできませんその内部バッファへのconst char型のポインタを返し、明らかに割り当てることはできません。文字列ごとにメモリを割り当ててコピーする必要があります。

argv[index] = new char[c->args[index].length()]; 
strcpy(argv[index], c->args[index].c_str()); 

cstring strcpyのヘッダ。

+0

これが機能しました。ありがとうございました! – minusila

+0

どのように 'strcpy'を未割り当て領域に移動しますか?私が物事を見ていない限り、これは記憶上書きのように見えます。 – PaulMcKenzie

+0

@PaulMcKenzie:あなたは私が編集していないものを実際に見ています。 – Unimportant

0

多分これは助けることができる:

char const **argv = new const char* [c->args.size() + 1];

+0

これにより、割り当てが機能しますが、文字列は後で変更したり、内部バッファを変更したり、移動したりして、コピーしたポインタを無効にすることができます。 – Unimportant

2

を使用すると、メモリやメモリの上書きを漏洩するチャンスがないと、これを行うにしたい場合は、以下の操作を行うことができます

typedef std::vector<char> CharArray; 
typedef std::vector<CharArray> ArgumentVector; 
//... 
ArgumentVector argVec; 
std::vector<char *>argv; 
for (int index = 0; index < c->args.size(); ++index) 
{ 
    // get the command and create copy 
    argVec.push_back(CharArray(c->args[index].begin(), c->args[index].end())); 

    // get pointer to newly created entity and place in argv vector 
    argV.push_back(argVec.back().data()); 
} 

// the last argument is NULL 
argV.push_back(NULL); 

execvp(argV[0], // the first item in the array 
     argV.data(), // the char** we are sending 

私たちが行ったすべてのstd::vector<char*>を作成しました。このベクターでポインタを設定する方法は、別のベクターのデータをポイントすることです。 std::vector<char*>が入力されると、char**は最初の項目へのポインタに過ぎません。

ところで、これは、vector<string>ではなくvector<char *>を使用する正当な理由の1つです。ほとんどの場合、文字列のベクトルが必要な場合は、vector<string>を使用します。

関連する問題