0

次のコードがあります。

int main(int argc, char *argv[])
{
  if(strcmp(argv[1],"-e")==0)
  { 
    //perform code
  }

  //code if argv[1] is not "-e"

return 0;
}

if ステートメント全体を取り出すと、次のようになります。

if(strcmp(argv[1], "-e")==0)

strcmp(argv[1], "-e") == 0) が "-e" でない場合、私のコードは正常に動作します。しかし、そのままにしておくと、上記の if ステートメントが true を生成する場合にのみコードが機能します。なぜこれが起こるのかについてのアイデアはありますか?例えば:

argv[1] をコメントアウトせずにコンパイルした場合:

//サンプルプログラムは実行可能ファイルになります

exampleProgram -e < a.txt は機能しますが、 exampleProgram < a.txt は機能しません。理由はありますか?

4

3 に答える 3

2

簡単です。プログラムに引数を送信args[1]しない場合、存在せず、割り当てられていないメモリ位置にアクセスしようとしています。

あなたは次のようなことをするかもしれません:

int main(int argc, char *argv[])
{
  if(argc > 1 && strcmp(argv[1],"-e")==0)
  { 
    //perform code
  }

  //code if argv[1] is not "-e"

return 0;
}
于 2012-12-03T02:11:32.297 に答える
1

argv は配列です。最後の要素を超えて配列にインデックスを付けようとすると、segfault が発生します。最後の要素を超えないようにするには、argc の値を確認します。argc - 1 は、アクセスできる最後の要素のインデックスになります。セグメンテーション違反の詳細: http://en.wikipedia.org/wiki/Segmentation_fault

于 2012-12-03T02:11:33.133 に答える
0

理由
exampleProgram -e < a.txtは機能し、 exampleProgram < a.txt機能しない
ためです。プログラムに引数が渡されない場合、 is noargv[1]は args 配列の範囲外です。テストの前に行う必要がargv[1]あるのは、最初にそれほど多くの引数があるかどうかを確認するテストです。

例えば:

if (argc > 1) {
  if(strcmp(argv[1],"-e")==0) {

  }
}

argcプログラムに存在する引数の数を保持するために使用されるため、範囲外になる前にこれをテストできます。

于 2012-12-03T02:14:14.277 に答える