4

のコマンドライン引数を変更または消去したいと考えていargvます。

//Somewhere near the top of main()

bool itemFound(false);
for(int i=1; i<argc; ++i) {
  if(argv[i] == "--item") {
    itemFound = true;
    //And remove this item from the list
    argv[i] = "      ";   //Try to remove be just inserting spaces over the arg
  }
}

//Now, use argc/argv as normal, knowing that --item is not in there

ただし、--itemリストにはまだ含まれています。

これを行う最善の方法は何ですか?

4

2 に答える 2

1

C++ を使用しているため、すべての C ライクな文字列を std::string に変換できます。この操作はプログラムの最初に 1 回行われるため、効率に問題はありません。

//Somewhere near the top of main()

bool itemFound(false);
for(int i=1; i<argc; ++i) {
  if(std::string(argv[i]) == std::string("--item") ) {
    itemFound = true;
    //And remove this item from the list
    argv[i][0] = 0;   //Transform it in an empty string, putting null as first character
  }
}

//Now, use argc/argv as normal, knowing that --item is not in there

それ以外の場合 (argv によるハッキングを回避):

std::vector<std::string> validArgs;
validArgs.reserve(argc); //Avoids reallocation; it's one or two (if --item is given) too much, but safe and not pedentatic while handling rare cases where argc can be zero
for(int i=1; i<argc; ++i) {
  const std::string myArg(argv[i]);
  if(myArg != std::string("--item") )
    validArgs.push_back(myArg);
}

何らかの理由で itemFound が必要な場合は、if ブロックで設定できます。

(注:これは戦いのトピックですが、単一のステートメントを持つブロックがある場合は中括弧は必要ありません:) https://softwareengineering.stackexchange.com/questions/16528/single-statement-if-block-braces- or-no )

編集(std::string と char* の間の比較演算子の存在に注意してください)

bool itemFound(false);
for(int i=1; i<argc; ++i) {
  if(std::string("--item") == argv[i] ) {
    itemFound = true;
    //And remove this item from the list
    argv[i][0] = 0;   //Transform it in an empty string, putting null as first character
  }
}

また:

std::vector<std::string> validArgs;
validArgs.reserve(argc); //Avoids reallocation; it's one or two (if --item is given) too much, but safe and not pedentatic while handling rare cases where argc can be zero
for(int i=1; i<argc; ++i)
  if(std::string("--item") != argv[i] )
    validArgs.push_back(std::string(argv[i]) );
于 2013-06-18T21:23:50.213 に答える