3

入力されたオプション/パラメータに対して、argv[]を使用するif/ thenステートメントをどのように使用しますか?

たとえば、a.out -d1sample.txtとa.out-e1sample.txt比較します。

int main (int argc, char *argv[])
{
  ifstream infile(argv[3]);

  int c;
  int number = 0;
  int count = 0;

  while ( infile.good() ) {

            if (argv[1] == "-d")
            {

                 c = infile.get();

                 number = atoi(argv[2]);  

                  if (number == count)
                 {
                 cout.put(c);
                 count = 0;
                 }

                      else
                        count++;

            }       


           if (argv[1] == "-e")
           { 
              cout << "entered -e" << endl;   //testing code
           }


  }//end while

}//end main
4

5 に答える 5

3

等価演算子を使用して C スタイルの文字列を比較することはできません。使用する必要がありますstd::strcmp

if (std::strcmp(argv[1], "-d") == 0)

その背後にある理由は、==演算子がポインターが指すものではなくポインターを比較することです。

于 2012-11-28T07:29:32.003 に答える
1

argc/argv は C に由来するもので、使用するのはかなり面倒です。そのため、基本的な引数の受け渡し以上の処理が行われると、引数を文字列のベクトルに変換し、C++ スタイルで作業できます。

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

main(int argc, char* argv[])
{
  std::vector<std::string> args;
  std::transform(argv+1, argv+argc, std::back_inserter(args), [](char* arg){ return std::string(arg); });

  if (args.at(1) == "-d") { std::cout << "Arg 1 = -d" << "\n"; }

  for (auto& arg: args) { std::cout << "arg: " << arg << "\n"; }
}

それでも、引数が存在することを確認する必要があります。これが基本的なツールであり、パラメーターが存在しない場合にツールが中止されることを許容できる場合は、args.at(x)代わりにargs 要素にアクセスできます。args[x]

または、引数パーサーについては、この SO の質問を確認してください。

于 2012-11-28T09:10:03.027 に答える
1

入力パラメーター-dまたは-eを確認したいと思いますよね?その場合は strcmp() を使用してください

if (!strcmp(argv[1],"-d")) {

            count++;
            printf("\ncount=%d",count);

        }       

       if (!strcmp(argv[1],"-e"))
       { 
          printf("entered -e");   //testing code
       }
于 2012-11-28T07:43:25.500 に答える
1

最初のエラーは、次の最初の行にありmainます。

ifstream infile(argv[3]);

第三引数がないので書けません。次のようにプログラムを呼び出すと:

a.out -d 1 < sample.txt

次に、プログラムが認識するコマンド ラインは次のようになります。

argv[0] = "a.out"
argv[1] = "-d"
argv[2] = "1"

対照的に、 はシェル< sample.txtによって直接解釈され、ファイルはプログラムの標準入力にストリーミングされます。プログラム内でそれを変更するためにできることは何もありません。

解析自体については、ファイルを読み取るループで実行しないでください。前に実行して、適切なフラグを設定してください。

実際の解析については、ライブラリを使用して多くの手間を省くことをお勧めします。標準の Unix ツールはgetopt、C インターフェイスしかありません。いくつかの C++ ライブラリがあり、その中にはBoost.Program_Optionsがありますが、これは私の好みには少し複雑すぎます。

于 2012-11-28T07:54:12.660 に答える
0

char argv[] は char * の配列な ので、

 if (string(argv[1]) == "-d")
于 2012-11-28T07:30:28.320 に答える