11

私が現在受講しているデータ構造クラスでは、C++でWebクローラーを作成する必要があります。有利なスタートを切るために、教授は、指定されたURLからソースを取得するプログラムと、タグを取り除くための単純なHTMLパーサーを提供してくれました。このプログラムのmain関数は引数を受け入れるため、argc/argvを使用します。引数のチェックに使用されるコードは次のとおりです。

// Process the arguments
if (!strcmp(option, "-h"))
{
    // do stuff...
}
else if (!strcmp(option, ""))
{
    // do stuff...
}
else if (!strcmp(option, "-t"))
{
    // do stuff...
}
else if (!strcmp(option, "-a"))
{
    // do stuff...
}

if ( *argv == NULL )
{
    exit(1);
}

「option」にargv[1]のスイッチが設定されており、argv[2]以降には残りの引数があります。私が理解している最初のブロックは、スイッチが文字列と等しい場合、スイッチに基づいて何でも実行します。最後のifブロックの目的は何なのか気になります。

私のC++はやや錆びている可能性がありますが、*argvはargv[0]と同等であり、基本的には引数が存在することを確認していることを思い出しているようです。argv [0]には常に(少なくともほとんどの実装では)実行中のプログラムの名前が含まれているという印象を受けた場合を除きます。argcが0の場合、argv [0]がnullになる可能性がありますが、Googleで検索しても、それが可能かどうかを判断する投稿は1つも見つかりませんでした。

そして、私はあなたに目を向けます。ブロックチェックの場合、その最終的なものは正確には何ですか?

編集:選択した回答のコメントに記載されている理由を使用しました。プラットフォーム固有のmainの実装に基づいて、意図的にargv [0]をNULLにするか、そうでなければNULLにする可能性があるということです。

4

4 に答える 4

12

3.6.1/2:

argc がゼロ以外の場合、これらの引数は argv[0] で提供されますが、... argv[0] は、プログラムまたは "" を呼び出すために使用される名前を表す NTMBS の最初の文字へのポインターでなければなりません。の値は argc非負でなければなりません。の値はargv[argc]0 とする。

鉱山を強調します。argc は、ゼロ以外ではなく、負でないことのみが保証されます。

メインへの入り口です。//do stuffの値argv、またはそれが指す配列の内容を変更することも可能です。オプション処理コードが処理中に値を argv からシフトすることは、まったく前例のないことではありません。したがって、のテスト*argv == nullは、オプションが削除またはスキップされた後に、コマンドライン引数が残っているかどうかをテストすることになります。残りのコードを確認する必要があります。

于 2010-02-25T17:26:47.427 に答える
10

argc渡されたコマンドライン引数の数を提供します。argv十分な引数がないかどうかを確認するために、内容を確認する必要はありません。

if (argc <= 1) { // The first arg will be the executable name
   // print usage
}
于 2010-02-25T17:18:02.190 に答える
4

C の移植性を思い出すと、Windows や Unix などの標準プラットフォームで常に実行されるとは限りません。おそらく、安価なハッキングされた環境で実行されている洗濯機内のマイクロコードです。そのため、ポインターを逆参照する前にポインターが null でないことを確認することをお勧めします。これにより、問題が発生する可能性があります。

それでも、あなたは正しいです。*argv は argv[0] と同じであり、argv が提供されている場合、環境によって初期化されることになっています。

于 2010-02-25T17:25:39.897 に答える