3
//Checks if an argument was specified
if (argv[1] != "")
    strcpy(Buff1, argv[1]);
else
    strcpy(Buff1, "default");

私が実行した場合: ./program test

Buff1 = テスト

私が実行した場合: ./program

Buff1 = パッケージ/= パッケージ

何も指定されていない場合、デフォルトで Buff1 が「デフォルト」になるようにするにはどうすればよいですか?

4

5 に答える 5

2

argc、プログラムに渡される引数の数を示します。は常にプログラムの名前であるためargc、1 未満にはならないことに注意してください。渡された引数がない場合は、これを使用する必要があります。argv[0]if(argc == 1){}

于 2013-06-09T07:53:17.323 に答える
2

argc主な引数がどのように渡されるかを知るために使用します。シェルまたはプロセスの呼び出し元は、一般に少なくとも 1 つの引数をプログラムに与えます。それは、プログラム名自体であり、常に最初の引数です。argc=1少なくとも、argv[0]プログラム名であることがわかりました。

  int main(int argc, char **argv){
      // declarations and all here
      if(argc<2){
         strcpy(Buff1, "default");

        }
       else{
          strcpy(Buff1, argv[1]);
      }
     return 0;
  }

これを使用しないと、2 つの問題があります。を使用するargv[1]と、argc=1実際には配列が範囲外になります。c++は境界チェックを行わないため、プログラムが argv[0] の隣のメモリ アドレスに暗黙のうちにアクセスすることに失敗することがあります。!=もう 1 つの問題は、文字列を演算子と比較しようとしていることです。==/!=演算子を使用して文字列リテラルをすぐに比較することはできません。strcmpまたは同等の機能を使用する必要があります。

于 2013-06-09T07:53:18.200 に答える
1

argc引数の数を決定するために使用します。引数が指定されていない場合は 1 になり、引数が 1 つ指定された場合は 2 になります。

==演算子を使用して C 文字列を比較できないことに注意してください。ポインタ比較です。

于 2013-06-09T07:52:30.220 に答える
1

何も渡されなければ、argc は 1 になります (argc は渡された引数の数を示します)。これは、何かを含む唯一の argv 要素が argv[0] (プログラムの名前を含む) になることを意味します。つまり、argv[1] の呼び出しは範囲外のインデックスになり、クラッシュを引き起こす可能性があります。運が良ければ、ジャンク データになることもあります。

if(argc == 1)
   strcpy(Buff1, "default");

else if(argc == 2)
    strcpy(Buff1, argv[1]);

else
    //do something here if there is more than 1 argument passed to it

また、例の引数を渡す方法が意図したとおりに機能しないことに注意することも価値があります。 [1] は「Buff1」、argv[2] は「=」、argv[3] は「test」です。

「./program test helllooo」を呼び出すだけで、私が提供したプログラム スニピットで動作し、Buff1 に「helllooo」が入力されます。また、「./program test」の呼び出しも機能し、Buff1 に「default」を入力します。より高度なことを行うには、コマンド ライン スイッチ (./program test -b somethinghere -x somethinghere など) に入る必要があります。これは、argc と argv を解析するより高度な方法です。

于 2013-06-09T08:02:37.270 に答える