2

私はboost::tokenizerC++ で文字列をトークン化するために使用していexecvます。

次のコード スニペット (コンパイル可能) を検討してください。

#include <iostream>
#include <cstdlib>
#include <vector>
#include <boost/tokenizer.hpp>

// I will put every token into this vector
std::vector<const char*> argc;
// this is the command I want to parse
std::string command = "/bin/ls -la -R";


void test_tokenizer() {
  // tokenizer is needed because arguments can be in quotes
  boost::tokenizer<boost::escaped_list_separator<char> > scriptArguments(
              command,
              boost::escaped_list_separator<char>("\\", " ", "\""));
  boost::tokenizer<boost::escaped_list_separator<char> >::iterator argument;
  for(argument = scriptArguments.begin(); 
    argument!=scriptArguments.end(); 
    ++argument) {

    argc.push_back(argument->c_str());
    std::cout << argument->c_str() << std::endl;
  }

  argc.push_back(NULL);
}

void test_raw() {
  argc.push_back("/bin/ls");
  argc.push_back("-l");
  argc.push_back("-R");

  argc.push_back(NULL);
}

int main() {
  // this works OK
  /*test_raw();
  execv(argc[0], (char* const*)&argc[0]);
  std::cerr << "execv failed";
  _exit(1);
  */

  // this is not working
  test_tokenizer();
  execv(argc[0], (char* const*)&argc[0]);
  std::cerr << "execv failed";
  _exit(2);
}

を呼び出すこのスクリプトを実行するとtest_tokenizer()、「execv failed」と出力されます。(ただし、引数はうまく表示されます)。

ただし、変更test_tokenizerするtest_rawと正常に動作します。

それはいくつかの簡単な解決策でなければなりませんが、私はそれを見つけられませんでした。

PS .: 私はこれをブーストをサポートするオンライン コンパイラにドロップしますこちら.

4

1 に答える 1